为什么在python中重写getattr方法时没有无限循环

时间:2015-07-21 08:32:06

标签: python python-2.7 getattr getattribute

我试图覆盖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

2 个答案:

答案 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__失败时。)