Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的多态性和重写_Python_Oop_Inheritance_Polymorphism_Overriding - Fatal编程技术网

Python中的多态性和重写

Python中的多态性和重写,python,oop,inheritance,polymorphism,overriding,Python,Oop,Inheritance,Polymorphism,Overriding,我有两个类:A和B。我想构建一个C类,它能够覆盖A和B的一些常用方法。 我想重写的方法应该能够调用基类的方法 实际上,我想收集一些关于类A和B的统计数据,但对我的代码的其余部分是透明的。现在,A和B有一些共同的方法,显然是以不同的方式实现的。我想要一个C类,它共享a和B的接口,同时做一些其他的操作,比如测量一些共享方法的运行时间 我可以举一个例子: import time class A: def __init__(self): pass def co

我有两个类: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中实现这种情况的正确方法是什么?它是如何被称为设计模式的,我几乎肯定有,但我想不起来了


提前感谢。

您可以使用组合而不是多态性来解决这个问题,这意味着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'

注意:如果您传递的对象未声明公共方法,您将获得AttributeError,以覆盖e的方法。GA您的类C必须继承A:class CA。如果您希望行为与基类不同,则需要重新定义。那么类C应该重写类A或类B的方法吗?我不明白你的问题。如果您解释一下此代码的用例,可能会有所帮助。这可能是一个问题,是的,当然。但是我如何通过在两个不同的课程上进行条件训练来做到这一点呢?我用拳击技巧写了这个例子来说明我的问题,但我希望使用继承。对,那么为什么简单的组合不起作用呢?你有什么方法重写?我不明白为什么必须重新定义类A和类B的所有方法。@juanpa.arrivillaga类A和类B有更多的方法。我必须在C类中重写,对于每个方法,比如def other_method*args,**kwargs:return self.my_obj.other_method*args,**kwargs。这仍然是可行的,但我认为应该有一个更好的解决办法。也许我错了,不是在我回答的时候。你确定吗?然而,这种方法有一个问题,我必须在C中重新声明A和B的所有其他方法。你必须想象,我有很多运行A和B类对象的代码,我只想使用C类来扩充A和B类,但这个操作必须对其余的代码是透明的。在这里,类似于继承的东西将非常合适,而不是这个装箱。如果在Python中没有其他方法,那么我将以这种方式实现,但老实说,我认为它是一个肮脏的解决方案。