我正在研究OOP方法。但现在我坚持了这一点。我想要的模型是X类和Y类。它具有许多计算和不同的方法。 X和Y类需要在该类中输入。然后从类X.cal1和Y.cal2输出。总结一下Z类,但是Z类需要输入来自己计算类。该代码是代表我的计算流程的示例。不是实际的我的代码。看来每个班级都需要输入。但是它不能成为一个大类,而在该类中具有许多功能。它需要自己上课。然后将所有班级加入新班级。 现在我的代码不起作用。
class X():
def __init__(self,x):
super(X, self).__init__()
self.x = x
def cal1(self):
return self.x*2
class Y():
def __init__(self,y):
super(Y, self).__init__()
self.y = y
def cal2(self):
return self.y/2
class Z(X,Y):
def __init__(self,Z):
super(Z, self).__init__()
self.Z = Z
self.xx = X.cal1()
self.yy = Y.cal2()
def cal3(self):
return self.z+self.xx+self.yy
if__name__=='__main__':
R1 = X(30)
R2 = Y(20)
R3 = Z(R1,R2,50)
答案 0 :(得分:0)
我不喜欢这种方法,但是您可以使用:
class Z(X, Y):
def __init__(self, x, y, z):
super().__init__(x)
super(X, self).__init__(y)
self.z = z
并删除super()
和X
中的Y
呼叫。
另一种方法是使用kwargs或在__init__
中不使用参数,以便您可以在所有类中保留相同的初始化签名。完成后,您可以使用super()
和方法解析顺序(MRO)来调用初始化函数。调用堆栈如下所示:
Z(x=.., y=.., z=..)
呼叫Z.__init__
Z.__init__
得到z
kwarg并调用super().__init__(**kwargs)
的{{1}} X.__init__
得到X.__init__
kwarg并调用x
的{{1}} super().__init__(**kwargs)
得到Y.__init__
kwarg并调用Y.__init__
的{{1}} 注意:没有参数的y
仅在Python 3中有效。
我想到的最后一种方法不是(!)使用super,而只是直接在super().__init__()
内部调用object.__init__
和super()
。