Мне всегда говорили, что множественное наследование — это плохо, поэтому я старался избегать этого. Я не вникал, почему это проблема.
Недавно я столкнулся с использованием множественного наследования в некотором коде 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?
Спасибо,
Джейсон Маззотта
Проблема здесь не в множественном наследовании. Дело в том, что
ClassB
иClassC
вызывают метод, который, по их мнению, не должен существовать. Большинство статически типизированных языков ООП даже не допустили бы этот код. Я бы сказал, что посколькуClassB
иClassC
вызывают методClassA
, то они должны оба наследоваться от него в этом случае.1) Какой результат вы бы хотели? 2) Зачем вам заботиться откуда взялся
randomMethodName
?@SilvioMayolo, Of Class и Class наследуются от класса A, тогда может ли ClassD наследоваться от ClassA, ClassB и ClassC?
@chepner, 1) я хочу, чтобы вывод оставался прежним 2) мне все равно, откуда берется randomMethodName, я просто хочу, чтобы было очевидно, откуда он берется.
Если C и B оба наследуют от A, то D может наследовать от B и C и косвенно получить A. В этом случае нет причин, чтобы D явно наследовал от A, поскольку он уже будет его родительским классом.