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,我们得到了无限循环。