繁体   English   中英

python类多重继承中的方法覆盖

[英]Method overriding in python class multiple inheritance

我有一个由两个类Addersubtractor Adder继承的Base类,其中我重写了名为test_func()的方法以适应各自的类属性。

class Base():
    def __init__(self, K):
        self.K = K
    def test_func(self):
        'Must be overridden since used by another_func()'
        return self.K
    def another_func(self):
        return self.K * self.test_func()

class Adder(Base):
    def __init__(self, K, M):
        Base.__init__(self, K)
        self.M = M
    def test_func(self):
        return self.M + self.K

class Subtractor(Base):
    def __init__(self, K, N):
        Base.__init__(self, K)
        self.N = N
    def test_func(self):
        return self.N - self.K

我正在编写一个名为Algebra的超类,它继承了AdderSubtractor

class Algebra(Adder, Subtractor):
    def __init__(self, K, M, N):
        Adder.__init__(self, K, M)
        Subtractor.__init__(self, K, N)

现在我想从超类Algebra中的AdderSubtractor中选择性地使用test_func()方法。 有没有办法做到这一点? 我试过

G = Algebra(K=2, M=5, N=7)
G.test_func()
>> 7

但它只采用Adder类的方法。 有没有办法告诉超类从哪个类评估方法? 例如,

G.test_func('Adder')

获得此结果的唯一方法是重新定义Algebra.test_func()以使其明确地以这种方式工作,即:

class Algebra(Adder, Subtractor):
    def __init__(self, K, M, N):
        Adder.__init__(self, K, M)
        Subtractor.__init__(self, K, N)

    def test_func(self, which):
        if which == "Adder"):
            return Adder.test_func(self)
        elif which == "Subtractor":
            return Subtractor.test_func(self)
        else:
            raise ValueError("don't know %s" % which)

但这是一团糟,也是滥用继承的完美例子。 继承意味着“是一个”关系,这意味着Base任何子类都应该保持兼容的接口(相同的客户端代码必须能够与任何Base子类的实例相同地工作)——上面没有。

现在问问自己: AlgebraAdder还是Subtractor 如果是,那么您的设计问题与test_func()本身有关。 否则( Algebra有一个Adder和一个Subtractor ),不要从AdderSubtractor继承,而是使用组合/委托。

不要覆盖test_func 提供两个方法,每个方法都调用所需的父类的test_func

class Algebra(Adder, Subtractor):
    def __init__(self, K, M, N):
        Adder.__init__(self, K, M)
        Subtractor.__init__(self, K, N)

    def test_adder_func(self):
        return Adder.test_func(self)

    def test_subtractor_func(self):
        return Subtractor.test_func(self)

我忽略了任何更深层次的问题,比如你为什么在这里选择多重继承。

继承的工作方式是

  1. 大多数时候你会参考父类
  2. 使用子类实例化

在你的情况下,而不是

G = Algebra(K=2, M=5, N=7)

你应该说

G = Adder(K=2, M=5, N=7)

然后通过G.test_func()调用各自的函数

在您的示例中,运行时永远不会知道如何调用子方法,因为您已经实例化了一个父对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM