继承多个类而无需在python中进行多次初始化

时间:2019-07-19 18:16:29

标签: python oop

我正在尝试以这种方式设计在单个python文件中具有多个类的代码,其中A类是C()D()类的Abstract类,B类也是Parent C()D()的两个类别。

正如您所看到的,在执行这些类中的任何功能之前,我正在使用super().__init__来初始化Abstract类和Parent类。

代码如下:

from abc import ABC, abstractmethod

class A(ABC):
    def __init__(self):
        print('Running A.__init__')

    @abstractmethod
    def function(self):
        pass

class B():
    def __init__(self):
        print('Running B.__init__')


class C(A,B):
    def __init__(self):
        print('Running C.__init__')
        # C.__init__()
        super(C, self).__init__()
        super(A,self).__init__()

    def function(self):
        pass

class D(A,B):
    def __init__(self):
        print('Running D.__init__')
        super(D,self).__init__()
        super(A, self).__init__()

    def function(self):
        pass


foo = C()
bar = D()

输出:

Running C.__init__
Running A.__init__
Running B.__init__
Running D.__init__
Running A.__init__
Running B.__init__

有兴趣学习如何避免多重初始化,简而言之,我要在执行C()D()之前初始化抽象类A和父类B,其中C和D具有从A继承的所有功能和B

foo = C()
bar = D()

Running A.__init__
Running B.__init__
Running C.__init__
Running D.__init__

我最近尝试学习OOPS概念,请帮助如果需要重新设计代码。谢谢

2 个答案:

答案 0 :(得分:0)

在C或D中运行初始化程序代码之前,可以通过运行super().__init__()初始化父类。

即使未调用初始化函数,C和D仍将继承A和B的方法。

答案 1 :(得分:0)

确保每个人都在使用super,而不仅仅是CD。这样可以确保以正确的顺序调用每个类的__init__。如果您开始在子类中向__init__添加参数,则会变得更加复杂,因为您不知道何时调用super().__init__()时,接下来将调用哪个类的方法。

from abc import ABC, abstractmethod

class A(ABC):
    def __init__(self):
        super().__init__()
        print('Running A.__init__')

    @abstractmethod
    def function(self):
        pass

class B():
    def __init__(self):
        super().__init__()
        print('Running B.__init__')


class C(A,B):
    def __init__(self):
        print('Running C.__init__')
        super().__init__()

    def function(self):
        pass

class D(A,B):
    def __init__(self):
        super().__init__()

    def function(self):
        pass


foo = C()
bar = D()

例如,C的方法解析顺序为[C, A, B, object]。当您呼叫C()时,C.__init__首先被呼叫。它对super的调用导致A.__init__被下一个调用。 super中对A.__init__的调用不会{em> not 转到object的直接基类A;它进入B.__init__,因为这是初始化的对象(A的实例)的MRO中C之后的下一个类。然后,最后,B.__init__使用super导致object.__init__被调用。