MRO
MRO(Method Resolution Order,方法解析顺序)是指在多继承情况下,Python 解释器按照特定的顺序来查找和调用方法的规则。
class A:
pass
class B:
pass
class C(A, B):
pass
print(C.__mro__)
# 输出:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
多继承背景下的调用逻辑
以下是对 BootStrapForm
类中 super().__init__(*args, **kwargs)
具体情况的详细解释:
在Python的面向对象多继承体系中,像 LoginForm
类继承了 BootStrapForm
和 forms.Form
这两个类。当在 BootStrapForm
的 __init__
方法里写了 super().__init__(*args, **kwargs)
时,Python会依据方法解析顺序(MRO)规则来确定到底调用哪个父类的 __init__
方法。
一般来说,Python 3遵循的是C3线性化的MRO算法,按照这个规则,它会先查找继承链里相对更靠前的父类的 __init__
方法来执行(这里就是 forms.Form
的 __init__
方法,通常情况下,Python解释器会认为它在继承顺序里更靠前,当然这取决于具体的类定义顺序等因素)。
例如,假设我们简化一下代码逻辑来看看继承顺序,可以使用 LoginForm.__mro__
来查看方法解析顺序,可能得到类似这样的元组 (LoginForm, BootStrapForm, forms.Form, object)
,这表明在查找方法时,会按照这个顺序依次查找,所以 super().__init__(*args, **kwargs)
首先调用的就是 forms.Form
的 __init__
方法,目的是让 forms.Form
完成自身相关的初始化操作,比如初始化表单里包含的各个字段相关的基础属性等内容,确保从 forms.Form
继承过来的那些基本的表单特性和属性都能正确设置好。