【发布时间】: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