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
中。