8

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

请注意,如果通过正常机制找到该属性,则不会调用 __getattr__()。(这是 __getattr__() 和 __setattr__() 之间的故意不对称。)这样做是出于效率原因,并且因为否则 __getattr__() 将无法访问实例的其他属性。

我在理解最后一条语句时遇到问题:

将无法访问实例的其他属性

它究竟如何无法访问其他属性?(我想它与无限递归有关,但没有其他方法可以访问实例属性,比如直接访问self.__dict__?)

4

2 回答 2

4

如果您尝试使用self.__dict__[key]asself.__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 回答