3

Pythonリファレンスから以下のサンプルコードを実行してみました。

>>> 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)

次に、以下のコードをテストしました。

In [16]: c = C()
class getattribute invoked
class getattribute invoked

In [17]: c
Class getattribute invoked
Class getattribute invoked
Out[17]: Class getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Class getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
<__main__.C at 0x29448d0>

出力について明確な説明ができる人はいますか? 非常に多くの「Metaclass getattribute invoked」が表示されるのを見ました。これは、__getattribute__()が何度も呼び出されたことを意味します。

4

1 に答える 1