class Test(object):
i = 0
def add(self):
Test.i += 1
print "Test.i == ",Test.i
print "'i' in dir(Test) == ",'i' in dir(Test)
print "'i' in Test.__dict__ == ",'i' in Test.__dict__
t1 = Test()
print '\n# t1 = Test() executed'
print "t1.i == ",t1.i
print "'i' in dir(t1) == ",'i' in dir(t1)
print "'i' in t1.__dict__ == ",'i' in t1.__dict__
結果
Test.i == 0
'i' in dir(Test) == True
'i' in Test.__dict__ == True
# t1 = Test() executed
t1.i == 0
'i' in dir(t1) == True
'i' in t1.__dict__ == False
.
オブジェクトの名前の属性は__dict__
、このオブジェクトの名前空間を表す辞書です。つまり、オブジェクトの属性が含まれています。
また、次のものがあります。
dir([オブジェクト])
オブジェクトに という名前のメソッドがある場合__dir__()
、このメソッドが呼び出され、属性のリストを返す必要があります。
dir(t1)
では、属性 i を含み、属性iを含まないということはどのように可能t1.__dict__
でしょうか? 2 つすべてdir(Test)
にTest.__dict__
属性iが含まれていますが、 ?
.
それはあなたの質問に答えるのと同じ理由です:
オブジェクトの属性を返す動作は厄介です。
そして`dir(object)
、このぎこちなさを反映しています:
デフォルトの dir() メカニズムは、完全ではなく最も関連性の高い情報を生成しようとするため、オブジェクトの種類によって動作が異なります。
オブジェクトがモジュール オブジェクトの場合、リストにはモジュールの属性の名前が含まれます。
•オブジェクトが型またはクラスオブジェクトの場合、リストにはその属性の名前と、そのベースの属性が再帰的に含まれます。
•それ以外の場合、リストには、オブジェクトの属性の名前、そのクラスの属性の名前、およびそのクラスの基本クラスの属性の再帰的な名前が含まれます。
.
それから、あなたの質問への答えは2つの部分に分かれています:
1)dir(t1)
オブジェクトの属性と見なされるものを示しますが、オブジェクトの REAL NAMESPACE として公開され、属性it1.__dict__
が含まれていません。これは、すでに回答されているように、実際にはクラスの属性です。
したがって、 2 つのインスタンスt1とt2の疑似属性iは等しいように見えます。これは、式とが実際には として評価される
ためです
。t1.i
t2.i
Test.i
dir(t1)
dir(t2)
Test.i
2) 式が??t1.i
として評価される方法
そのため(これは私の回答の追加情報を構成します):Test.i
クラス インスタンスには、属性参照が検索される最初の場所であるディクショナリとして実装された名前空間があります。そこに属性が見つからず、インスタンスのクラスにその名前の属性がある場合、検索はクラス属性で続行されます。
http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy
これは、オブジェクトの名前空間で属性が見つからない場合、オブジェクトがインスタンスであるクラスの名前空間で検索されることを意味します。