在python中我有3个类a,B,c,类c是a,b的子类,现在当我创建类c的对象时,只有类c的构造函数被调用

lpwwtiir  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(134)

在python中我有3个类a,B,c。类c是a,b的子类。现在当我创建类c的对象时,只有类c的构造函数被调用。我希望类a,b的构造函数也被调用。

class a:
    def __init__(self):
        print("initializing a")
class b:
    def __init__(self):
        print("initializing b")
class c(a,b):
    def __init__(self):
        print("initializing c")
e=c()

我得到了这个结果
初始化c
我还以为
初始化
初始化B
初始化c

pgx2nnw8

pgx2nnw81#

在Python中,当你定义一个继承自多个父类的子类时,只有子类定义中列出的第一个父类的构造函数会被自动调用。这是因为,在Python中,方法解析顺序(MRO)决定了父类构造函数的调用顺序。
在你的例子中,由于在c的定义中a列在b之前,所以只调用a的构造函数,而不调用b的构造函数。要调用b的构造函数,可以使用super()函数从c的构造函数显式调用它,如下所示:

class a:
    def __init__(self):
        print("initializing a")

class b:
    def __init__(self):
        print("initializing b")

class c(a, b):
    def __init__(self):
        super().__init__()  # Call the constructor of a
        b.__init__(self)    # Call the constructor of b
        print("initializing c")

e = c()

这里,super().init()调用a的构造函数,B.init(self)调用b的构造函数。这将输出预期结果:

initializing a
initializing b
initializing c
mnowg1ta

mnowg1ta2#

我认为你搜索的是Multiple Inheritance,所以你必须使用super().__init__() [仅适用于python 3],就像这个例子[适用于python 2和3]:

class A:
    def __init__(self):
        super(A, self).__init__()
        print("initializing A")
class B:
    def __init__(self):
        super(B, self).__init__()
        print("initializing B")

class C(B, A):
    def __init__(self):
        super(C, self).__init__()
        print("initializing C")
e=C()

输出:

initializing A
initializing B
initializing C

关于super()的一个很好的描述,你会发现here。* 顺便说一下,PEP 8:类名通常应使用CapWords或CamelCase约定 *。

nxowjjhe

nxowjjhe3#

你必须用super()调用其他类的构造函数。我也认为一个类只能扩展一个类。

class a:
    def __init__(self):
        print("initializing a")
class b(a):
    def __init__(self):
        print("initializing b")
        super().__init__()
class c(b):
    def __init__(self):
        print("initializing c")
        super().__init__()
e=c()

现在它在创建e时调用每个构造函数。

相关问题