1. ホーム
  2. パイソン

[解決済み】__getattr__と__getattribute__の違いについて理解する。

2022-04-01 11:28:32

質問

との違いを理解しようとしています。 __getattr____getattribute__ しかし、私はそれで失敗しています。

は、その 答え Stack Overflow の質問に対する の違い __getattr____getattribute__ は言う。

__getattribute__ は、実際の属性を見る前に呼び出されます。 オブジェクトを作成するのは難しいです。 を正しく実装する必要があります。正しく実装すると 無限ループに陥りやすい。

全く意味がわかりません。

そして、こう続きます。

ほぼ間違いなく __getattr__ .

なぜ?

を読んだのですが、もし __getattribute__ が失敗します。 __getattr__ が呼び出されます。では、なぜ同じことをするのに2つの異なるメソッドがあるのでしょうか?私のコードが新しいスタイル・クラスを実装している場合、何を使うべきでしょうか?

この疑問をクリアにするために、コード例を探しています。できる限りググってみましたが、見つかった回答は、この問題を十分に議論していません。

ドキュメントがあれば、それを読む準備はできています。

どのように解決するのですか?

まずは基本的なことを。

オブジェクトでは、その属性を扱う必要があります。通常、私たちは instance.attribute . もっと制御が必要な場合もあります(事前に属性名がわからない場合)。

例えば instance.attribute は次のようになります。 getattr(instance, attribute_name) . このモデルを使って、属性を取得するために 属性名 を文字列で指定します。

使用方法 __getattr__

また、クラスが明示的に管理していない属性をどのように扱うかを指定し、それを __getattr__ メソッドを使用します。

Pythonは、まだ定義されていない属性を要求するたびに、このメソッドを呼び出します。

古典的な使用例です。

class A(dict):
    def __getattr__(self, name):
       return self[name]
a = A()
# Now a.somekey will give a['somekey']

の注意点・使い方 __getattribute__

すべての属性をキャッチする必要がある場合 存在するか否かにかかわらず を使用します。 __getattribute__ の代わりに その違いは __getattr__ は、実際には存在しない属性に対してのみ呼び出されます。 もし属性を直接設定したなら、その属性を参照すれば __getattr__ .

__getattribute__ がずっと呼ばれている。