object .__ getattribute__如何避免RuntimeError?

时间:2016-08-04 18:41:26

标签: python recursion magic-methods

在极少数情况下,必须覆盖对象的__getattribute__方法,但常见的错误是尝试返回有问题的属性,如下所示:

class WrongWay:
    def __getattribute__(self, name):
        # Custom functionality goes here
        return self.__dict__[name]

由于递归循环,此代码总是产生RuntimeError,因为self.__dict__本身就是一个调用相同__getattribute__方法的属性引用。

根据this answer,解决此问题的正确方法是将最后一行替换为:

...
        return super().__getattribute__(self, name) # Defer responsibility to the superclass

此解决方案在通过Python 3解释器运行时起作用,但它似乎也违反了__getattribute__的承诺功能。即使超类链遍历到object,在行的末尾,某人最终还是必须返回self. 某些,并且根据定义,属性引用必须首先获得通过孩子的__getattribute__方法。

Python如何解决这个递归问题?在object.__getattribute__中,如果没有循环到另一个请求中,如何返回任何内容?

1 个答案:

答案 0 :(得分:2)

  

在该行的末尾,某人最终必须返回self. 某些内容,并且根据定义,属性引用必须首先通过子项的__getattribute__()方法。

这不正确。 object.__getattribute__未定义为返回self.anything,并且它不尊重__getattribute__的后代类实现。 object.__getattribute__是默认的属性访问实现,它始终通过默认属性访问机制执行其工作。

同样,object.__eq__未定义为返回self == other_thing,并且它不尊重__eq__的后代类实现。 object.__str__未定义为返回str(self),并且它不尊重__str__的后代类实现。 object的方法是这些方法的默认实现,它们总是执行默认操作。