【发布时间】:2020-12-09 19:40:20
【问题描述】:
我正在尝试构建机器人行为的模拟。我有一个 Robot 父抽象类和一个正常工作的 NormalRobot 子类。我想构建一个 FaultyRobot 子类,可能带有部分“并行”继承之类的东西?
父类 Robot 有一个抽象的 move() 方法,因为我希望我的所有 Robot 子类都能够以相同的名称调用 move()
NormalRobot 有一个功能方法move(),它模拟一个“转”,在指定方向上移动指定距离。 (多次调用move()模拟多个“转”)
FaultyRobot 还应该有一个move() 方法,它几乎与 NormalRobot 的 move() 相同,只是在“转弯”开始时它随机有可能不移动和改变方向。显然,我可以通过编写随机代码(我在辅助方法 turn_is_faulty() 中拥有)并复制粘贴 NormalRobot 的 move() 的内容来做到这一点。但显然,重复代码是一种不好的礼仪。 Python 继承使得从父类 Robot 继承 move() 方法变得非常容易,但我需要来自并行子类 NormalRobot 的 move()。
我想象代码看起来像
def Class FaultyRobot:
def move(self):
if self.turn_is_faulty():
self.set_robot_direction(360 * random.random())
else:
#call the NormalRobot move()
Python 是否允许某种部分“并行”继承?
【问题讨论】:
-
如果故障类继承自普通类而不是ABC,它可以调用
super方法。不过,这有点尴尬。您还可以使用 ABC 的外部/静态方法来处理正确的移动(而不是在普通类中定义),然后让普通类直接使用该单独的函数,并让故障类有条件地使用它。跨度> -
您认为
Robot的哪些子类不会 使用NormalRobot.move或其变体?听起来更像FaultyRobot应该继承自NormalRobot。另一种选择是让Robot.move提供默认实现,以便FaultyRobot可以通过super访问它。 -
另一种观点是,一个正常的机器人和一个故障机器人是一样的,只是它出现故障的概率是0。
-
@chepner 认为 NormalRobot 出现错误动作的概率为 0,这是一个绝妙的观点!谢谢你。然而,NormalRobot 和 FaultyRobot 对其功能的其他部分有其他方法,这使得它们无法完全相互继承
-
@Carcigenicate 我希望 ABC move() 部分是抽象的,以便我可以编写具有不同移动算法的其他子类,然后我可以比较不同子类的效率对彼此。这里特别是 FaultyRobot 的 move() 与 NormalRobot 的 move() 几乎相同,但其他子类的 move() 方法可能具有完全不同的内容
标签: python inheritance subclass