コードがあります:
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 はそれがインスタンスに存在するかどうかを確認し、存在しない場合はクラスを検索します。a
C
a