gpt4 book ai didi

python - 为什么在python中覆盖getattr方法时没有无限循环

转载 作者:太空宇宙 更新时间:2023-11-04 10:22:23 25 4
gpt4 key购买 nike

根据我的理解,我正在尝试覆盖 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

最佳答案

您正在 Test.__getattr__ 中调用 object.__getattribute__

这里不涉及循环。

此外,根据 the docs , __getattribute__ 不会隐式调用 __getattr__

修改后更新

Here__getattribute__ 调用的 C 实现。特别是 slot_tp_getattr_hook 部分。

在您的情况下,属性查找失败导致第 6072 行调用您的自定义 __getattr__ 函数。

从那时起,AttributeError 已被清除。但是您对 object.__getattribute__ 的调用会将其设置回去,而第 6074 行或 6075 行将不会处理它。

object.__getattribute__ 调用已实现 like so从而(重新)引发 AttributeError(第 1107 行)。

关于python - 为什么在python中覆盖getattr方法时没有无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31534023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com