は、Python 2.7.12ドキュメント(。3.4.12新しいスタイルのクラス¶のための特別な方法で検索)から取得したコードスニペットです:任意のインスタンスをバイパスすることに加えなぜメタクラス__getattribute__が呼び出されたのですか?ここ
は の関心の属性
>>> class Meta(type): ... def __getattribute__(*args): ... print "Metaclass getattribute invoked" ... return type.__getattribute__(*args) ... >>> class C(object): ... __metaclass__ = Meta ... def __len__(self): ... return 10 ... def __getattribute__(*args): ... print "Class getattribute invoked" ... return object.__getattribute__(*args) ... >>> c = C() >>> c.__len__() # Explicit lookup via instance Class getattribute invoked 10 >>> type(c).__len__(c) # Explicit lookup via type Metaclass getattribute invoked 10 >>> len(c) # Implicit lookup 10
私の質問です、なぜmetacl:正確には、暗黙の特別なメソッドのルックアップは、一般的にさえも、オブジェクトのメタクラスの __getattribute__()
方法をバイパスtype(c).__len__(c)
を実行すると、__getattribute__
が呼び出されますか?
type(c)
は、C
を生成するので、このステートメントはC.__len__(c)
と書き直すことができます。 C.__len__
は、C
クラスで定義されているアンバインドされたメソッドであり、C.__dict__
にあります。なぜMeta
がルックアップに含まれていますか?