Многоклассовое наследование - PullRequest
0 голосов
/ 05 ноября 2018

Я изучаю метод ООП. но теперь я застрял с этим. Модель, которую я хочу, это класс 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 голосов
/ 05 ноября 2018

Мне не нравится подход, но вы можете использовать:

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 кварг и звонит super().__init__(**kwargs), что составляет X.__init__
  • X.__init__ получает x kwarg и звонит super().__init__(**kwargs), что составляет Y.__init__
  • Y.__init__ получает y kwarg и звонит super().__init__(), что object.__init__

Примечание: super() без аргументов работает только в Python 3.

Последний подход, который я могу придумать, - это (!) Не использовать super, а просто вызывать X.__init__(self, x) и Y.__init__(self, y) внутри Z напрямую.

...