自我.__ class__错误的类继承?

时间:2012-04-08 08:32:34

标签: python pylons wtforms

我正在使用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时,一切都还可以!

我不明白......据我所知,他们必须是同义词。怎么了?

1 个答案:

答案 0 :(得分:6)

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

因为super的第一个参数是一个指标,MRO中的搜索超级方法应该继续(非正式地:你现在的位置),传递self.__class__总是重新开始在任何类self的(直接)超类中是一个实例。假设在类层次结构中的其他地方进行了适当的super调用,这最终会让您回到MyForm.process,并且我们已经获得了无限循环。