8

Pythonのドキュメントでは、__getattr__関数について次のように述べています。

属性が通常のメカニズムで見つかった場合、__getattr__() は呼び出されないことに注意してください。(これは __getattr__() と __setattr__() の間の意図的な非対称性です。) これは、効率上の理由と、そうでなければ __getattr__() がインスタンスの他の属性にアクセスする方法がないためです。

最後のステートメントを理解するのに問題があります。

インスタンスの他の属性にアクセスする方法はありません

他の属性にアクセスする方法がないというのは、具体的にどのようなことでしょうか? (無限再帰と関係があると思いますが、インスタンス属性にアクセスする他の方法はありませんself.__dict__か?)

4

2 に答える 2

4

self.__dict__[key]などself.__dict__を呼び出すように使用しようとすると、無限再帰が発生します__getattr__。もちろん、を使用すると、このサイクルから抜け出すことができますがobject.__getattr__(self,key)、それは新しいスタイルのクラスに対してのみ機能します古いスタイルのクラスで使用できる一般的なメカニズムはありません。

__setattr__その場合、直接使用できるため、この問題は発生しないことに注意してください(したがって非対称性)。self.__dict__

于 2012-11-07T14:46:56.047 に答える
1

魔法の__getattribute__()方法は とのペアです__setattr__()が、大きな力には大きな責任が伴います。 __getattr__()大きな責任を負う必要がないように提供されています。@mgilson がコメントで指摘しているように、このように機能した場合、 内からインスタンスの属性にアクセスすること__getattr__()__getattribute__()できません__getattr__()。これを見るためにもself.__dict__、属性ルックアップ機構を使用する必要があるためです。

于 2012-11-07T14:41:16.810 に答える