【发布时间】:2020-04-10 19:39:39
【问题描述】:
假设我有一个类似的python类:
class Meal(object):
def __init__(self, starter, main="steak"):
self.starter = starter
self.main = main
def new_meal_eaten_starter(self):
return Meal("Eaten-%s" % self.starter, main=self.main)
def __repr__(self):
return "%s %s" % (self.starter, self.main)
现在我想继承这个类,添加一些数据:
class MealWithDessert(Meal):
def __init__(self, dessert, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dessert = dessert
def __repr__(self):
return "%s %s %s" % (self.starter, self.main, self.dessert)
这当然会发生:
>>> x = MealWithDessert("cake", "salad", "pizza")
salad pizza cake
>>> x.new_meal_eaten_starter()
eaten-salad pizza
当然我想看的是吃沙拉披萨蛋糕。 我可以通过重写方法来使用基本方法来解决这个问题:
def new_meal_eaten_starter(self):
new_meal_no_dessert = super().new_eaten_starter()
new_meal = MealWithDessert(self.dessert, new_meal_no_dessert.starter, main=new_meal_no_dessert.main)
return new_meal
... 但这该死的丑陋。或者通过基本上复制基本方法(违反 DRY):
def new_meal_eaten_starter(self):
return MealWithDessert(self.dessert, "Eaten-%s" % self.starter, main=self.main)
...对于更复杂的功能,这两个选项都非常可怕。肯定有更好的方法吗?
【问题讨论】:
-
当心 PEP 8 声明类名应遵循骆驼大小写约定。 python.org/dev/peps/pep-0008/#class-names。否则它们看起来像 python 函数调用
标签: python inheritance methods overriding