は、次のことを考えてみましょう:__getattribute__はいつ属性検索に関与しませんか?
class A(object):
def __init__(self):
print 'Hello!'
def foo(self):
print 'Foo!'
def __getattribute__(self, att):
raise AttributeError()
a = A() # Works, prints "Hello!"
a.foo() # throws AttributeError as expected
__getattribute__
の実装は、明らかに、すべてのルックアップに失敗しました。私の質問:
- なぜオブジェクトをインスタンス化できますか?私は
__init__
メソッド自体のルックアップも失敗すると予想していました。 __getattribute__
の対象外の属性の一覧は何ですか?
'.__ dict__'にアクセスすると' __getattribute __() 'は呼び出されません。 – zondo
ああ、私は今の違いを参照してください。私は授業の外でもそれが真実だと思った。私はちょうどいくつかのテストを行いました。クラス本体の外で '.__ dict__'にアクセスすると' __getattribute__'が呼び出されますが、 '__getattr__'は呼び出されません。私はなぜ彼らが区別を作ったのだろうか。 – zondo
@zondo 'self .__ dict__'にアクセスするには' __getattribute__'も必要です。 '__getattr__'は、属性が' __getattribute__'によって見つからないときに最後の手段として呼び出されます。 –