どうも。ひろです。
今回はPythonを用いてインスタンスについて解説していきます。
インスタンス
そもそも複数インスタンスを生成した場合、全て別のものになります。
厳密にいうと別々のアドレスに割り当てられます。
subject1というインスタンスとsubject2というインスタンスがあるとします。
それぞれインスタンスを生成すると割り当てられるアドレスが違うのでsubject1のインスタンスで変更を加えたとしてもsubject2のインスタンスには変更が反映されません。
全く違うアドレスに格納されているのでクラスが一緒のインスタンスでも別物になります。
以下が実装例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Subject(): def set_Subject(self): # インスタンス変数を設定 self.japanese = '国語' self.math = '数学' # 一つ目のインスタンス生成 subject1 = Subject() subject1.set_Subject() # 二つ目のインスタンス生成 subject2 = Subject() subject2.set_Subject() # インスタンス変数の表示と割り当てられたアドレス表示 print(subject1.japanese , id(subject1)) print(subject1.math ,id(subject1)) print('#' * 20) print(subject2.japanese , id(subject2)) print(subject2.math ,id(subject2)) |
実行結果
クラスSubjectの中にインスタンス変数を設定するsetSubject()メソッドがあります。
このメソッドの中でselfを用いてインスタンス変数を設定しています。
selfは自分自身、つまりインスタンス自身のことを指します。
.(ドット)をつけてjapaneseというインスタンス変数に国語という文字列を代入しています。
subject1という変数にSubjectクラスのインスタンスを格納します。
subject2も同様です。
そしてsetSubject()を呼び出し、インスタンス変数をせってし、その後インスタンス変数にアクセスします。
国語、数学と表示されているのがわかると思います。
第2引数に入っているid()というのは格納されているアドレスを取得するメソッドになっています。
取得したアドレスを表示させてみると国語と数学は同じアドレスになっていることがわかります。
これはインスタンス内の変数なので確保されているアドレスの領域はインスタンス分
つまり国語と数学二つが格納できるようにアドレスが割り振られています。
subject2とアドレスを比較すると、異なっていることがわかりますね。
これが同じクラスを使用してインスタンスを複数生成すると異なるアドレスを指定するため、
別々の領域にデータを格納しているので別物ということがわかります。
まとめ
まとめとして以下のとおりです。
インスタンスを複数生成した場合は全く別のものになる。
生成すればするほど別のアドレスに格納されていきます。
アプリ起動してインスタンス作ったらそのインスタンスを使い回したいなどあるとおみます。
そのためにデザインパターンのSingletonパターンを利用することで実現することができます。
次回はSingletonパターンについて解説していきます。
ここまで読んでくださりありがとうございました。