【问题标题】:Polymorphism and Overriding in PythonPython中的多态性和覆盖
【发布时间】:2018-08-01 08:20:11
【问题描述】:

我有两个类:A 和 B。我想构建一个 C 类,它能够覆盖 A 和 B 的一些常用方法。 我想覆盖的方法应该能够调用基类的方法。

在实践中,我想收集一些关于 A 类和 B 类的统计数据,但对我的其余代码是透明的。现在,A 和 B 有一些共同的方法(显然以不同的方式实现)。我想要一个类 C,它共享 A 和 B 的接口,同时做一些其他操作(即测量一些共享方法的运行时间)。

我可以做这个例子:

import time
class A:

     def __init__(self):
          pass

     def common_method(self):
          return "A"

class B:

     def __init__(self):
          pass

     def common_method(self):
          return "B"

class C:

     def __init__(self, my_obj):
          self.my_obj
          self.time_avg = 0
          self.alpha = 0.1
          pass

     def common_method(self):
          start = time.time()
          ret =  self.my_obj.common_method()
          stop = time.time()
          self.time_avg = (1. - self.alpha) * self.time_avg + self.alpha * (stop - start)
          return ret

我希望从这个例子中可以清楚地看出从 C 继承的 A 和 B 是工作的。

但是,不幸的是,这种方法需要我重新定义A类和B类的所有方法......这很繁琐和肮脏!

在python中实现这种情况的正确方法是什么?以及它是如何被称为设计模式的(我几乎可以肯定有,但我不记得了)。

提前致谢。

【问题讨论】:

  • 为了覆盖 e 的一个方法。 G。 A 你的类 C 必须继承 A:类 C(A)。如果您想要与基类不同的行为,则需要重新定义。
  • 那么C 类是否应该覆盖A 类或B 类的方法?我不明白你的问题。如果您解释了此代码的用例,它可能会有所帮助。这可能是XY problem
  • @Humbalan 是的,当然。但是我怎样才能通过调节两个不同的课程来做到这一点呢?我使用装箱技术编写了示例以明确我的问题,但我希望使用继承。
  • 对,那么为什么简单的合成不起作用呢?你有什么方法可以重写?我不明白你为什么要重新定义A类和B类的所有方法。
  • @juanpa.arrivillaga 类 A 和 B 有更多方法。我必须在 C 类中重写每个方法,例如 def other_method(*args, **kwargs): return self.my_obj.other_method(*args, **kwargs)。它仍然是可行的,但我认为应该有一个更好的解决方案。也许我错了

标签: python oop inheritance polymorphism overriding


【解决方案1】:

你可以用组合而不是多态来解决这个问题,这意味着一个 C 对象将持有一个 A 对象或一个 B 对象:

class C:
    def __init__(self, obj):
        self._obj = obj
    def common_method(self):
        return self._obj.common_method()

然后你就可以使用它了:

>>> ca = C(A())
>>> cb = C(B())
>>> ca.common_method()
'A'
>>> cb.common_method()
'B'

注意:如果你传递一个没有声明common_method方法的对象,你会得到一个AttributeError

【讨论】:

  • 我回答时没有。
  • 你确定吗?但是这种方式的问题是我必须在 C 中重新声明 A 和 B 的所有其他方法。你必须想象我有很多代码运行 A 和 B 类的对象,我只想使用一个 C 类“增加” A 和 B,但此操作仍然必须对其余代码透明。在这里,类似于继承的东西真的很合适,而不是这种“装箱”。如果python没有其他方法,那我就这样实现,但老实说我认为这是一个肮脏的解决方案。
猜你喜欢
  • 2012-10-11
  • 2012-02-08
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2017-10-25
相关资源
最近更新 更多