我试图覆盖getattr方法并按照我的理解 默认情况下,下面的代码片段中应该有无限循环 调用 object .__ getattribute __(self,attr)将调用覆盖的getattr方法,因为名称空间中不存在属性“notpresent”,此过程将不断重复。任何人都可以帮我弄清楚为什么在这里没有观察到这种行为。
此外,我无法弄清楚为什么在使用点表示法访问属性时完成对getattribute的隐式调用时,为什么不引发AttributeError,而当我们尝试在方法中显式调用getattribute时第二次使用点符号
class Test(object):
#Act as a fallback and is invoked when getattribute is unable to find attribute
def __getattr__(self,attr):
print "getattr is called"
return object.__getattribute__(self,attr) #AttributeError is raised
t=Test([1,2,3,4])
b = t.notpresent
答案 0 :(得分:4)
您在object.__getattribute__
内呼叫Test.__getattr__
。
这里没有涉及循环。
此外,根据the docs,__getattribute__
不会隐式调用__getattr__
。
Here是__getattribute__
调用的C实现。特别是slot_tp_getattr_hook
部分。
在您的情况下,属性查找失败会导致执行调用您的自定义__getattr__
函数的第6072行。
从那时起,AttributeError
已被清除。但是,您拨打object.__getattribute__
会将其设置回来,而第6074或6075行也无法处理。
object.__getattribute__
调用已实施like so,因此(重新)提升AttributeError
(第1107行)。
答案 1 :(得分:0)
由于__getattribute__
通常只在对象和类似地方的__dict__
中查找属性,因此不会隐含地调用__getattr__
来检索属性。
请注意,如果__getattribute__
调用__getattr__
__getattr__
,如果__getattribute__
找不到属性,则可能会调用__getattr__
方法(因为查询应该调用{{1}当__getattribute__
失败时。)