python - 切换祖先顺序会破坏初始化吗?

标签 python django django-forms

这是来自 Django 应用程序,以自定义形式使用多重继承:

from django import forms

class CommonForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, request, *args, **kwargs):
        print 'CommonForm.__init__'
        super(CommonForm, self).__init__(request, *args, **kwargs)
        print 'CommonForm.__init__ FINISHED'
        self._request = request

class MyMixin(object):
    def __init__(self, *args, **kwargs):
        print 'MyMixin.__init__'
        super(MyMixin, self).__init__(*args, **kwargs)
        print 'MyMixin.__init__ FINISHED'

class CustomForm(CommonForm, MyMixin):
    def __init__(self, request, *args, **kwargs):
        print 'CustomForm.__init__'
        super(CustomForm, self).__init__(request, *args, **kwargs)
        print 'CustomForm.__init__ FINISHED'

# weird initialization:
frm = CustomForm(http_request)

# outputs:
CustomForm.__init__
CommonForm.__init__
CommonForm.__init__ FINISHED
CustomForm.__init__ FINISHED

什么会导致 MyMixin.__init__ 被跳过?! 没有错误消息,没有抛出异常,什么都没有......

如果我将类继承顺序切换为

class CustomForm(MyMixin, CommonForm):

所有初始化器都按预期突然调用:

frm = CustomForm(http_request)

CustomForm.__init__
MyMixin.__init__
CommonForm.__init__
CommonForm.__init__ FINISHED
MyMixin.__init__ FINISHED
CustomForm.__init__ FINISHED

谁能解释一下这是怎么回事吗?

最佳答案

我不确定为什么会发生这种情况,但我确实知道在使用多重继承时不应该使用 super(),而是应该:

    CommonForm.__init__(request, *args, **kwargs)
    MyMixin.__init__(*args, **kwargs)

这是一个很好的例子:http://www.python-course.eu/python3_multiple_inheritance.php

关于python - 切换祖先顺序会破坏初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238581/

相关文章:

python - 格式字符串舍入不一致

python - Django)属性错误: 'datetime.date' object when trying to get an object of model

javascript - Ajax 搜索功能在 django 应用程序中不起作用

python - Django - 模型继承

python - 打开上传的 CSV 文件时出现类型错误

python - 如何解析 ISO 8601 格式的日期?

python - 处理两个大文件的高效 Python 方法?

python - Django对象模型——动态设置值

python - nosetest 的奇怪行为

Django QuerySet values() 包括 ForeignKey 字段