在Python的documentation, on the __getattr__
function中,它说:
请注意,如果属性是 通过正常机制发现,__ getattr __()未被调用。 (这是故意的不对称 在__getattr __()和__setattr __()之间。)这是出于效率原因和因为 否则__getattr __()将无法访问该实例的其他属性。
我在理解最后一句话时遇到了问题:
无法访问实例的其他属性
究竟如何无法访问其他属性? (我想这与无限递归有关,但是没有其他方法来访问实例属性,例如来自self.__dict__
directy?)
答案 0 :(得分:3)
如果您尝试使用self.__dict__[key]
,self.__dict__
会调用__getattr__
等等,您将获得无限递归。当然,如果您可以突破此周期使用object.__getattr__(self,key)
,但仅适用于新样式类。没有可用于旧式类的通用机制。
请注意,__setattr__
没有此问题,因为在这种情况下,您可以直接使用self.__dict__
(因此不对称)。
答案 1 :(得分:1)
__getattribute__()
魔术方法与__setattr__()
成对,但强大的力量带来了巨大的责任。提供__getattr__()
,这样您就不必担任重大责任部分。正如@mgilson在评论中指出的那样,如果__getattr__()
作为__getattribute__()
工作,您将无法从__getattr__()
内访问该实例的任何属性,因为即使查看{{ 1}}你需要使用属性查找机制。