关于python:self.__class__错误的类继承

Wrong class inheritance with self.__class__?

本问题已经有最佳答案,请猛点这里访问。

我在以东城继承遗产。我上了下节课:

1
2
3
4
class MyForm(WTForms):
    ...
    def process(self, formdata=formdata, obj=None):
        super(self.__class__, self).process(formdata=formdata, obj=obj)

我也犯了错误(不总是这样,但在某些情况下,形式相似——这更奇怪):

Maximum recursion depth have been exceeded

但当我换了self.__class__MyForm之后,一切都很好!

我不明白…我知道它们一定是同义词。发生了什么?


它们不是同义词。self可以是从MyForm继承的类的任何对象。python不会悄悄地为调用继承的方法创建一个新的超类对象,它只是传递同一个对象(这样做会破坏多态性,并且不起作用)。而type()/.__class__显然是对象真正的一个类,而不是它的某个超类(你不希望MyShinyThing().__class__产生object,对吧?).如果__class__根据访问位置的不同而改变,那将是非常惊人的、非惯用的和无用的。这只是多态性。

作为super的第一个论据,是MRO中寻找超人方法应该继续(非正式地说,你现在在哪里)的一个指标,通过self.__class__总是从self所属的任何类的(立即)超类开始。假设类层次结构中的其他地方调用了适当的super,这最终会使您返回到MyForm.process,我们得到了无限循环。