getattr(foo, 'bar')
(これは基本的foo.bar
ある)__getattribute__
を呼び出し、(存在する場合)が__getattr__
から呼び出すことができる。
AttributeError
が__getattribute__
__getattribute__
によって発生する明示的
それを呼び出します
からdocs:
クラスも__getattr__()
を定義する場合、後者は明示的に呼び出すか、 AttributeError
を上げるのいずれか__getattribute__()
ない限り 呼び出されません。
__getattr__
を定義すると、ランダム属性アクセスで属性エラーを発生させたくない場合に役立ちます。 Mock libraryはそれの素晴らしい例です。
>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.foo.bar.spam
<Mock name='mock.foo.bar.spam' id='4367274280'>
あなたが__getattr__
のすべての時間を定義したり、あなたはデフォルト値を返すようにgetattr()
の3引数形式を使用することができますいずれかAttributeError
すべての時間を扱いたいしたくない場合は属性が見つからなかった場合、または使用hasattr
の存在を確認してください。
>> getattr([], 'foo')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-60-f1834c32d3ce> in <module>()
----> 1 getattr([], 'foo')
AttributeError: 'list' object has no attribute 'foo'
>>> getattr([], 'foo', 'default')
'default'
デモ:
class A:
def __getattr__(self, attr):
print('Inside A.__getattr__')
return 'eggs'
print(A().foo)
出力:データモデルのドキュメントがobject.__getattr__
としてそれを指摘するが、それは意味しないこと
Inside A.__getattr__
eggs
注意彼らはビルに存在するスズobject
タイプ。代わりに、それらは一般的なオブジェクトに存在することができます。この場合のオブジェクトは、オブジェクトの型に対してdunderメソッドを参照する型です。一般的に
これらのすべての「__getattr__」質問は、心配しています... –