1

我正在尝试设计我的代码,它在单个 python 文件中具有多个类,其中类 A 是类的抽象类,并且类 B 是类和C()D()父类。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()或之前初始化抽象类 A 和父类 B D(),其中 C 和 D 将具有从 A 和 B 继承的所有功能

foo = C()
bar = D()

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

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

4

2 回答 2

0

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

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

于 2019-07-19T18:26:30.963 回答
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原因。inA.__init__的调用不转到; 的直接基类。它转到,因为这是正在初始化的对象(的实例)的 MRO 中的下一个类。然后,最后,使用导致被调用。superA.__init__objectAB.__init__ACB.__init__superobject.__init__

于 2019-07-19T19:12:54.697 回答