あなたはインスタンス属性を割り当てるときに、そのインスタンスのプライベート辞書(__dict__
)が更新される、ということではなく、クラスの__dict__
。前者は要求された属性のルックアップに優先し、見つからない場合(最初の数行では常にobject2
)、属性の検索にはクラスの__dict__
が使用されます。具体的に
:
属性の割り当てや削除がインスタンスの辞書、決してクラスの辞書を更新します。クラスに__setattr__()
または__delattr__()
メソッドがある場合、これはインスタンスディクショナリを直接更新する代わりに呼び出されます。
(重点鉱山the Python documentation on the standard type hierarchy in the data modelから;。あなたは、サブセクション「クラスのインスタンス」、第二段落を見つける必要があります段落を、それはインスタンスを扱う前に、ルックアップ順序を属性全体のサブセクションと1の前に。 、 "カスタムクラス"はコンセプトを得るために読むのが良いかもしれませんが、幾分凝縮されているので、おそらく数回です。)
しばしば私は下に何が起こっているか理解するのに役立ちますどのような、IDおよび()この場合には、関連するインスタンス、クラスと属性の__dict__
属性を印刷することです。 IDはあなたが同じオブジェクトを見ていることを本当に保証するものではありませんが、CPythonを使用するときには一般的に私のために働いています。
あなたの本を印刷するように調整コード:
from __future__ import print_function
class MyClass(object):
value = 5
object1 = MyClass()
object2 = MyClass()
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
object1.value = 6
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
MyClass.value = 10
print(object1.value, id(object1.value), object1.__dict__)
print(object2.value, id(object2.value), object2.__dict__)
print(MyClass.value, id(MyClass.value), MyClass.__dict__)
と(快適さを読み取るための挿入いくつかの余分な改行やスペースを含む)私が手出力:
5 4325640816 {}
5 4325640816 {}
5 4325640816 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 5}
6 4325640848 {'value': 6}
5 4325640816 {}
5 4325640816 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 5}
6 4325640848 {'value': 6}
10 4325640976 {}
10 4325640976 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__module__': '__main__', 'value': 10}
IDはごとに変化しますここでは便宜的に'value'
は最後にMyClass.__dict__
に表示されますが、どの属性が変更され、どれが実質的に同じか、そして__dict__
属性がどのように更新されるかを確認できます。
(注:はない一般的に、いずれかから読み取ることがない、どのような方法でそれを使用しないでください__dict__
自身の属性変更しない他のビルトインメソッドと関数はそれを扱うみましょう。。)