Python object.\uuu getattribute\uuu如何避免运行时错误?
在少数情况下,必须重写对象的Python object.\uuu getattribute\uuu如何避免运行时错误?,python,recursion,magic-methods,Python,Recursion,Magic Methods,在少数情况下,必须重写对象的\uuu getattribute\uuu方法,常见的错误是尝试返回有问题的属性,如下所示: class WrongWay: def __getattribute__(self, name): # Custom functionality goes here return self.__dict__[name] 由于递归循环,此代码总是产生一个运行时错误,因为self.\uuuu dict.\uuuu本身就是一个属性引用,它调
\uuu getattribute\uuu
方法,常见的错误是尝试返回有问题的属性,如下所示:
class WrongWay:
def __getattribute__(self, name):
# Custom functionality goes here
return self.__dict__[name]
由于递归循环,此代码总是产生一个运行时错误,因为self.\uuuu dict.\uuuu
本身就是一个属性引用,它调用相同的\uuu getattribute.\uuu
方法
根据,此问题的正确解决方案是将最后一行替换为:
...
return super().__getattribute__(self, name) # Defer responsibility to the superclass
这个解决方案在通过Python3解释器运行时可以工作,但它似乎也违反了\uu getattribute\uu
承诺的功能。即使超类链被遍历到对象
,在该行的末尾,最终也会有人返回self.
某个东西,根据定义,属性引用必须首先通过子级的\uuu getattribute\uuuu
方法
Python如何解决这个递归问题?在object.\uuuu getattribute\uuuu
中,如何在不循环到另一个请求的情况下返回任何内容
在这行的末尾,有人最终必须返回self.
某物,根据定义,属性引用必须首先通过子级的\uuuu getattribute\uuuu()
方法
那是不对的object.\uuuuu getattribute\uuuuuu
未定义为返回self.anything
,并且它不考虑\uuuuuu getattribute\uuuuu
的子类实现object.\uuuu getattribute\uuuu
是默认的属性访问实现,它总是通过默认的属性访问机制执行其工作
类似地,object.\uuuuuu eq\uuu
也没有定义为返回self==other\u thing
,并且它不考虑\uuuuu eq\uu
的后代类实现object.\uuu str\uuu
未定义为返回str(self)
,并且它不尊重\uu str\uuu
的子类实现object
的方法是这些方法的默认实现,它们总是做默认的事情。我想你的意思是super()。\uuuu getattribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(名称)
,而不是super(),但是这里有一个可能的副本@wim确实,我的问题是一个副本!我的道歉;我努力确保这个问题不会给网站增添混乱。我将查看如何将问题标记为副本。谢谢您纠正我!因此,为了澄清,您提到的“默认属性访问机制”仅在Python的C实现中阐明?我的错误印象是,任何“神奇的方法”仍然是在Python的语法和约束下定义的,因此大大复杂了\uuu getattribute\uuuu
的策略。@RNanoware:如果您想看一看,它在Objects/object.c
中。