使用实例访问实例的其他属性
在Python的文档中,在__getattr__
函数中它说:
请注意,如果通过正常机制找到该属性,则不会调用__getattr __()。 (这是__getattr __()和__setattr __()之间的故意不对称)。这是出于效率原因,否则__getattr __()将无法访问实例的其他属性。
我在理解上一个陈述时遇到了一个问题:
将无法访问实例的其他属性
如何无法访问其他属性? (我猜它与无限递归有关,但是不存在其他方法来访问实例属性,例如来自self.__dict__
directy?)
如果您尝试使用self.__dict__[key]
作为self.__dict__
会调用__getattr__
等等,那么您将拥有无限递归。当然,如果使用object.__getattr__(self,key)
,则可以跳出此循环object.__getattr__(self,key)
,但只适用于新的风格类。 没有一种通用机制可以用于旧风格类。
请注意,您没有__setattr__
这个问题,因为在这种情况下,您可以直接使用self.__dict__
__setattr__
(因此不对称)。
__getattribute__()
魔术方法与__setattr__()
成对,但具有很大的权力是非常重要的。 __getattr__()
是为了让您不必承担责任重大部分。 @mgilson在注释中指出,如果__getattr__()
作为__getattribute__()
工作,您将无法从__getattr__()
内访问实例外的任何属性,因为即使查看self.__dict__
您也需要使用属性查找机器。