【发布时间】:2020-06-02 14:06:50
【问题描述】:
我最近在我的python 代码中遇到了一种奇怪的小气味,我认为这与并行继承有关。这是我编造的一个小例子:
class DogHabits:
def __init__(self):
self.habits = ['lick butt']
class GermanShepherdHabits(DogHabits):
def __init__(self):
super().__init__()
self.habits.extend(['herd sheep'])
class LabradorHabits(DogHabits):
def __init__(self):
super().__init__()
self.habits.extend(['hunt', 'pee on owner'])
class Dog:
def __init__(self):
self.type = 'generic_dog'
self.my_habits = DogHabits()
def do_stuff(self):
for habit in self.my_habits.habits:
print(habit)
class GermanShepherd(Dog):
def __init__(self):
self.type = 'german shepherd'
self.my_habits = GermanShepherdHabits()
class Labrador(Dog):
def __init__(self):
self.type = 'labrador'
self.my_habits = LabradorHabits()
if __name__ == "__main__":
german_shepherd = GermanShepherd()
print('\n{}'.format(german_shepherd.type))
german_shepherd.do_stuff()
labrador = Labrador()
print('\n{}'.format(labrador.type))
labrador.do_stuff()
我有一个通用的狗类,具体的狗实现继承自该类。每个狗类(包括通用/抽象类)都有一组习惯,它们本身由习惯的另一个类层次结构表示。
我对我必须始终拥有完全相同的两个层次结构这一事实感到恼火。此外,DogHabits 之间的继承在习惯层次结构中很有用,但在狗层次结构中没有用,因为我需要为狗层次结构中的每个类实例化一个单独的习惯对象。
解决这个问题的方法是什么?我可能想添加很多狗类的实现,更新相应的习惯层次结构听起来很乏味,而且闻起来很糟糕......
【问题讨论】:
-
这不是python问题。这是设计气味而不是代码气味。根本缺陷是您将设计和编码结合在一起。回到设计阶段,写一些 UML 并在编写任何代码之前解决问题。
-
好点....但不幸的是现在代码已经写好了
-
"但不幸的是现在代码已经写好了" - 没有任何区别。您仍然可以返回并正确设计它。
-
@nicomp 这就是我试图通过提出这个问题并从人们那里获得反馈的目的。请不要在这里绕圈子。
-
@JLPeyret 不,用于设计的 UML 类图不是一种气味。
标签: python oop diamond-problem