1

我正在处理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一切都很好!

我不明白...据我所知,它们一定是同义词。怎么了?

4

1 回答 1

6

它们不是同义词。self可以是继承自 MyForm的类的任何对象。Python 不会默默地创建一个新的超类对象来调用继承的方法,它只是传递同一个对象(这样做会破坏多态性并且没有用处)。并且type()/.__class__显然是对象实际上是一个实例的类,而不是它的某个超类(您不希望MyShinyThing().__class__yield object,对吗?)。__class__如果根据访问的位置进行更改,那将是非常惊人的、非惯用的和无用的。这只是多态性。

作为第一个参数super是一个指示符,在MRO中应该继续搜索超方法(非正式地:您当前所在的位置),传递self.__class__总是从self作为实例的任何类的(立即)超类开始。假设super在类层次结构中的其他地方进行了正确的调用,这最终会让你回到MyForm.process,我们就有了无限循环。

于 2012-04-08T08:42:49.413 回答