ホームページ >バックエンド開発 >Python チュートリアル >Python で属性を取得するための __getattr__ と __getattribute__ の使用法を比較する

Python で属性を取得するための __getattr__ と __getattribute__ の使用法を比較する

WBOY
WBOYオリジナル
2016-07-21 14:53:131693ブラウズ

ほとんどの場合、getattribute と getattr の詳細にあまり注意を払う必要はないと思います (少なくとも私自身:))、
通常の状況では、カスタム クラスを使用するときに、クラスの構造を理解しているため、意図的に逸脱して属性アクセス エラーを引き起こすことはありません。

しかし、好奇心旺盛で追求心が旺盛で気性の激しい Python の赤ちゃんとして、少し調べないわけがありません。さて、実際に Github 上のオープンソース プロジェクトである sinaweibopy のソース コードを読みました。このコードは非常に興味深いもので、コードをより動的でエレガントにするために gettattr をカスタマイズする方法を確認するための実践的な例として使用できます。

リーリー
対応するインスタンス属性が見つからない場合に getattr が呼び出される機能を最大限に活用し、ソースコード内で http メソッドが見つかった場合に対応する URL を連鎖呼び出しで生成すると便利です。 呼び出し可能なオブジェクトはよりエレガントになり、連鎖操作はエレガントなだけでなく、呼び出されるインターフェイス (残りのインターフェイス) の意味を適切に説明します。



1.__getattr__ の例:

リーリー

実行結果:


リーリー

クラス内の未定義のメソッドが呼び出された場合、 __getattr__ は次のようなメソッドも返します。


リーリー

実行結果:


62.__getattribute__ の例:


リーリー

実行結果:


リーリー

深く考えてください

一部のエレガントな機能は、カスタマイズされたクラスの getattr カスタム メソッドを通じて実現できるため、当然のことながら、同様のカスタム メソッド getattribute を含め、それについてもある程度理解する必要があります

1. インスタンス属性の取得と傍受として使用されます

インスタンス属性にアクセスする場合、独自の getattr メソッドが実装されていない場合は、属性が見つからないことを示す AttributeError がスローされ、独自の getattr メソッドが見つからないことを示します。このようにして、上記の例のように、プロパティに到達したときに呼び出されます。したがって、属性が見つからない場合にカスタム getattr メソッドを実装することによっていくつかの関数を実装することは良い方法です。 getattribute メソッドのように毎回呼び出されるのではなく、通常の属性アクセスに影響を与える可能性があるからです。
リーリー

2. getattribute をカスタマイズする際の無限再帰を防止します

属性にアクセスするときは getattribute が常に呼び出されるため、カスタム getattribute メソッドは同時に対応する属性を返す必要があります。self.__dict__ を介して値を取得すると、下方向に getattribute が呼び出され、循環呼び出しが発生します。 リーリー
ここで、フォーメーションの属性は、バインドされたスーパー オブジェクトを呼び出すことによって取得されます。新しいスタイルのクラスでは、実際には object.__getattribute__(self, item):

と同じです。
デフォルトでは、カスタマイズされたクラスはオブジェクトから getattribute メソッドを継承し、属性検索は完全に使用可能です getattribute の実装は非常に抽象的です。対応するインスタンス オブジェクトと検索したい属性の名前をバインドするだけです。

3. getattribute と getattr を同時にオーバーライドする場合は、元の動作を模倣して getattribute で AttributeError をスローするか、手動で getattr を呼び出す必要があります



リーリー
上記の例の getattr メソッドはまったく呼び出されません。元の AttributeError はスローされずに自分たちで処理され、getattr は手動で呼び出されなかったため、not_existed にアクセスした結果はデフォルトではなく None になります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。