在极少数情况下,必须覆盖对象的__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__
中,如果没有循环到另一个请求中,如何返回任何内容?
答案 0 :(得分:2)
在该行的末尾,某人最终必须返回
self.
某些内容,并且根据定义,属性引用必须首先通过子项的__getattribute__()
方法。
这不正确。 object.__getattribute__
未定义为返回self.anything
,并且它不尊重__getattribute__
的后代类实现。 object.__getattribute__
是默认的属性访问实现,它始终通过默认属性访问机制执行其工作。
同样,object.__eq__
未定义为返回self == other_thing
,并且它不尊重__eq__
的后代类实现。 object.__str__
未定义为返回str(self)
,并且它不尊重__str__
的后代类实现。 object
的方法是这些方法的默认实现,它们总是执行默认操作。