我正在尝试以这种方式设计在单个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概念,请帮助如果需要重新设计代码。谢谢
答案 0 :(得分:0)
在C或D中运行初始化程序代码之前,可以通过运行super().__init__()
初始化父类。
即使未调用初始化函数,C和D仍将继承A和B的方法。
答案 1 :(得分:0)
确保每个人都在使用super
,而不仅仅是C
和D
。这样可以确保以正确的顺序调用每个类的__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__
被调用。