множественное наследование в питоне и как это исправить

avatar
user2985081
8 апреля 2018 в 01:06
48
0
0

Мне всегда говорили, что множественное наследование — это плохо, поэтому я старался избегать этого. Я не вникал, почему это проблема.

Недавно я столкнулся с использованием множественного наследования в некотором коде Python, который показывает мне, почему множественное наследование — это плохо. Кажется, это нарушает концепцию инкапсуляции ООП. Упрощенная версия кода выглядит следующим образом.

В файле ClassA.py.

class ClassA:

    def randomMethodName(self):

        self.className = "A"

        print("I am ", self.className)

В файле ClassB.py.

class ClassB:

    def doB(self):

        ###################################
        #
        #  I didn't import anything but I can access this.
        #
        ###################################
        self.randomMethodName()

    def doDifferentB(self):

        print("This is a different part of B")

В файле ClassC.py.

class ClassC:

    def doC(self):
        ###################################
        #
        #  I didn't import anything but I can access this
        #
        ###################################
        self.randomMethodName()

    def doDifferentC(self):
        print("This is a different part of C")

В файле ClassD.py.

from ClassA import ClassA
from ClassB import ClassB 
from ClassC import ClassC

class ClassD ( ClassA, ClassB, ClassC ):

    def doD(self):

        self.randomMethodName()
        self.doB()
        self.doDifferentB()
        self.doC()
        self.doDifferentC()

а затем простой драйвер.

#!/path/to/python/interpreter/python

from ClassD import ClassD

if __name__ == "__main__":

    d = ClassD()
    d.doD()

Вывод выглядит следующим образом:

I am A
I am A
This is a different part of B
I am A
This is a different part of C

Кроме того, чтобы полностью переписать эти классы, может ли кто-нибудь предложить, как сделать так, чтобы стало ясно, что randomMethodName происходит от ClassA при использовании в ClassB и ClassC?

Спасибо,

Джейсон Маззотта

Источник
Silvio Mayolo
8 апреля 2018 в 01:09
3

Проблема здесь не в множественном наследовании. Дело в том, что ClassB и ClassC вызывают метод, который, по их мнению, не должен существовать. Большинство статически типизированных языков ООП даже не допустили бы этот код. Я бы сказал, что поскольку ClassB и ClassC вызывают метод ClassA, то они должны оба наследоваться от него в этом случае.

chepner
8 апреля 2018 в 01:09
0

1) Какой результат вы бы хотели? 2) Зачем вам заботиться откуда взялся randomMethodName?

user2985081
8 апреля 2018 в 13:54
0

@SilvioMayolo, Of Class и Class наследуются от класса A, тогда может ли ClassD наследоваться от ClassA, ClassB и ClassC?

user2985081
8 апреля 2018 в 13:56
0

@chepner, 1) я хочу, чтобы вывод оставался прежним 2) мне все равно, откуда берется randomMethodName, я просто хочу, чтобы было очевидно, откуда он берется.

Silvio Mayolo
8 апреля 2018 в 16:45
0

Если C и B оба наследуют от A, то D может наследовать от B и C и косвенно получить A. В этом случае нет причин, чтобы D явно наследовал от A, поскольку он уже будет его родительским классом.

Ответы (0)