コードがあります:
class C():
a=1
def f(self):
print "f func"
a=C()
print a.a
a.f()
>>> 1
>>> f func
a.__dict__またはを取得しようとするとvars(a)、 だけが表示されます{}。しかし
a.b=123
print a.__dict__
>>> {'b': 123}
わからない、なぜだ。
コードがあります:
class C():
a=1
def f(self):
print "f func"
a=C()
print a.a
a.f()
>>> 1
>>> f func
a.__dict__またはを取得しようとするとvars(a)、 だけが表示されます{}。しかし
a.b=123
print a.__dict__
>>> {'b': 123}
わからない、なぜだ。
a.__dict__orを見ると、インスタンスであるvars(a)の属性が表示されます。aそのインスタンスには、最初は独自の属性がありません。クラス定義で作成した属性aは、クラスのインスタンスではなく、クラス自体の属性です。後で を実行するときa.b = 123に、インスタンスだけにアトリビュートを作成して、インスタンスで確認できるようにします__dict__。を参照すると、属性aが表示されC.__dict__ます。
そうすると、Pythonはクラスprint a.aの属性を動的に見つけます。インスタンスに属性がないことがわかるので、クラスを調べてそこで見つけます。それが出力される値です。インスタンスの作成時にクラス属性がインスタンスに「コピー」されることはありません。むしろ、インスタンス属性を読み取ろうとするたびに、Python はそれがインスタンスに存在するかどうかを確認し、存在しない場合はクラスを検索します。aCa