使用实例访问实例的其他属性

在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__您也需要使用属性查找机器。

链接地址: http://www.djcxy.com/p/65719.html

上一篇: Access other attributes of the instance with

下一篇: Using CUDA to solve a system of equations in non