多类继承

时间:2018-11-05 20:34:38

标签: python oop inheritance methods multiple-inheritance

我正在研究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)

1 个答案:

答案 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()