【问题标题】:Python inheritance - add argument to parent methodPython 继承 - 向父方法添加参数
【发布时间】:2022-11-21 17:29:53
【问题描述】:

我有一个带有函数run 的基类。例如:

class A:
    @abstractmethod
    def run(self, steps):
        ...

可以为 run 方法定义带有更多参数的类 B。

class B(A):
    def run(self, steps, save):
        ...

使用打字,我可以指定函数是否获取 AB 作为参数。通过指定函数getsA,我告诉我只需要run的基本接口。在指定 B 时表示我需要扩展的。

此设计的目的是声明一个所有子级共享的基本接口,但每个子级都可以有一个扩展 API。

这是其他语言无法做到的。因此我想知道,这是一种反模式吗?这是合法的吗?

【问题讨论】:

  • 你在 B 类中使用 super().run(steps) 吗?
  • 如果类 A 有一个抽象方法,则不能实例化
  • @LucasM.Uriarte 我没有得到 A 的实例,打字说我得到了 A 的基类。

标签: python inheritance overriding


【解决方案1】:

在 Python 中,您可以执行以下操作。

class A:

  def run(self, steps):
    print("Using class A's run.")
    print(f"steps are {steps}")


class B(A):

  def run(self, steps, other_arg=None):
    if other_arg:
      print("Using class B's override.")
      print(f"steps are {steps}")
    else:
      # Use parent's run logic instead.
      super().run(steps)

x = B()
x.run(100)
x.run(30, other_arg="something")

# Using class A's run.
# steps are 100
# Using class B's override.
# steps are 30

现在,你应该这样做吗?有时间和地点。你也会惹上麻烦。想象一下,你破坏了你从中继承的核心对象的接口,所以核心对象失去了它的抽象价值。您最好拥有两个对象或重写您的抽象以更稳健地处理您希望表示的对象的差异。

【讨论】:

  • 如果基方法是抽象的,你的答案会有什么变化?目的是声明一个基接口,所有基类都实现该基接口,但每个基类都可以有更多参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2013-12-25
  • 2014-10-24
  • 2021-05-30
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多