使用__getattr __(self,name)访问实例的其他属性

Ele*_*naT 8 python attributes object

在Python的文档中,__getattr__它所说函数:

请注意,如果通过常规机制找到该属性,则不会调用__getattr __().(这是__getattr __()和__setattr __()之间的故意不对称.)这是出于效率原因而做的,因为否则__getattr __()将无法访问实例的其他属性.

我在理解最后一句话时遇到了问题:

无法访问实例的其他属性

究竟怎么没有办法访问其他属性?(我想这与无限递归有关,但是没有其他方法来访问实例属性,比如来自self.__dict__directy?)

Sil*_*Ray 1

神奇的方法__getattribute__()是与 成对出现的__setattr__(),但能力越大,责任越大。 __getattr__()提供这样您就不必承担很大的责任部分。正如 @mgilson 在评论中指出的那样,如果__getattr__()按照这种方式工作__getattribute__(),您将无法从内部访问实例的任何属性__getattr__(),因为即使要查看,self.__dict__您也需要使用属性查找机制。

  • 这就是您使用 __getattribute__()` 时所做的事情,但是 __getattr__()` 为您提供了一种很好的方法来干净地隐藏所有属性查找机制。`__getattribute__()` 基本上适用于您想要完全重新设计属性查找的情况,而 `__getattr__()` 用于处理其他常规对象中的一些特殊情况(尽管即使是 `__getattr__()` 通常也是矫枉过正,并且属性或装饰器通常就足够了)。 (2认同)