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

时间:2012-11-07 14:33:00

标签: python object attributes

在Python的documentation, on the __getattr__ function中,它说:

  

请注意,如果属性是   通过正常机制发现,__ getattr __()未被调用。 (这是故意的不对称   在__getattr __()和__setattr __()之间。)这是出于效率原因和因为   否则__getattr __()将无法访问该实例的其他属性。

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

  

无法访问实例的其他属性

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

2 个答案:

答案 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}}你需要使用属性查找机制。