ホームページ >バックエンド開発 >Python チュートリアル >Python で属性を取得するための __getattr__ と __getattribute__ の使用法を比較する
ほとんどの場合、getattribute と getattr の詳細にあまり注意を払う必要はないと思います (少なくとも私自身:))、
通常の状況では、カスタム クラスを使用するときに、クラスの構造を理解しているため、意図的に逸脱して属性アクセス エラーを引き起こすことはありません。
しかし、好奇心旺盛で追求心が旺盛で気性の激しい Python の赤ちゃんとして、少し調べないわけがありません。さて、実際に Github 上のオープンソース プロジェクトである sinaweibopy のソース コードを読みました。このコードは非常に興味深いもので、コードをより動的でエレガントにするために gettattr をカスタマイズする方法を確認するための実践的な例として使用できます。
リーリー
1.__getattr__ の例:
リーリー
リーリー
リーリー
6
2.__getattribute__ の例:
リーリー
リーリー
一部のエレガントな機能は、カスタマイズされたクラスの getattr カスタム メソッドを通じて実現できるため、当然のことながら、同様のカスタム メソッド getattribute を含め、それについてもある程度理解する必要があります
インスタンス属性にアクセスする場合、独自の getattr メソッドが実装されていない場合は、属性が見つからないことを示す AttributeError がスローされ、独自の getattr メソッドが見つからないことを示します。このようにして、上記の例のように、プロパティに到達したときに呼び出されます。したがって、属性が見つからない場合にカスタム getattr メソッドを実装することによっていくつかの関数を実装することは良い方法です。 getattribute メソッドのように毎回呼び出されるのではなく、通常の属性アクセスに影響を与える可能性があるからです。
リーリー
属性にアクセスするときは getattribute が常に呼び出されるため、カスタム getattribute メソッドは同時に対応する属性を返す必要があります。self.__dict__ を介して値を取得すると、下方向に getattribute が呼び出され、循環呼び出しが発生します。
リーリー
ここで、フォーメーションの属性は、バインドされたスーパー オブジェクトを呼び出すことによって取得されます。新しいスタイルのクラスでは、実際には object.__getattribute__(self, item):
3. getattribute と getattr を同時にオーバーライドする場合は、元の動作を模倣して getattribute で AttributeError をスローするか、手動で getattr を呼び出す必要があります
リーリー
上記の例の getattr メソッドはまったく呼び出されません。元の AttributeError はスローされずに自分たちで処理され、getattr は手動で呼び出されなかったため、not_existed にアクセスした結果はデフォルトではなく None になります。