Vit*_*mar 1 python pylons wtforms
我正在使用继承WTForms.我上了下课:
class MyForm(WTForms):
...
def process(self, formdata=formdata, obj=None):
super(self.__class__, self).process(formdata=formdata, obj=obj)
Run Code Online (Sandbox Code Playgroud)
我有错误(并非总是,但在某些情况下有类似的形式 - 它更奇怪):
Maximum recursion depth have been exceeded
但是当我改变了self.__class__→ MyForm一切都还好!
我不明白......据我所知,他们必须是同义词.怎么了?
小智 6
它们不是同义词.self可以是继承自 的类的任何对象MyForm.Python不会以静默方式创建一个新的超类对象来调用继承的方法,它只是传递相同的对象(这样做会破坏多态性并且不起作用).而type()/ .__class__显然是对象实际上是一个实例的类,而不是某些超类(你不期望MyShinyThing().__class__屈服object,对吧?).如果__class__根据访问的位置进行更改,那将是非常惊人的,非惯用的和无用的.这只是多态性.
而作为第一个参数super是一个指标,其中在MRO的supermethod搜索应继续(非正式:您当前所在),传球self.__class__总是回到开始在任何类(直接)超self是一个实例.假设super在类层次结构中的其他位置进行了适当的调用,这最终会让您回到原点MyForm.process,并且我们已经获得了无限循环.