我正在使用WTForms
中的继承。
我上了下课:
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
时,一切都还可以!
我不明白......据我所知,他们必须是同义词。怎么了?
答案 0 :(得分:6)
它们不是同义词。 self
可以是继承自 MyForm
的类的任何对象。 Python不会以静默方式创建一个新的超类对象来调用继承的方法,它只是传递相同的对象(这样做会破坏多态性并且不起作用)。 type()
/ .__class__
显然是对象实际上是一个实例的类,而不是某个类的超类(你不希望MyShinyThing().__class__
产生object
,对吧?)。如果__class__
根据访问的位置而改变,那将是非常惊人的,非惯用的和无用的。它只是多态性。
因为super
的第一个参数是一个指标,MRO中的搜索超级方法应该继续(非正式地:你现在的位置),传递self.__class__
总是重新开始在任何类self
的(直接)超类中是一个实例。假设在类层次结构中的其他地方进行了适当的super
调用,这最终会让您回到MyForm.process
,并且我们已经获得了无限循环。