2

コードがあります:

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}

わからない、なぜだ。

4

2 に答える 2

4

a.__dict__orを見ると、インスタンスであるvars(a)の属性が表示されます。aそのインスタンスには、最初は独自の属性がありません。クラス定義で作成した属性aは、クラスのインスタンスではなく、クラス自体の属性です。後で を実行するときa.b = 123に、インスタンスだけにアトリビュートを作成して、インスタンスで確認できるようにします__dict__。を参照すると、属性aが表示されC.__dict__ます。

そうすると、Pythonはクラスprint a.aの属性を動的に見つけます。インスタンスに属性がないことがわかるので、クラスを調べてそこで見つけます。それが出力される値です。インスタンスの作成時にクラス属性がインスタンスに「コピー」されることはありません。むしろ、インスタンス属性を読み取ろうとするたびに、Python はそれがインスタンスに存在するかどうかを確認し、存在しない場合はクラスを検索します。aCa

于 2013-06-08T19:37:33.963 に答える