python类多重继承中的方法重写

问题描述 投票:1回答:2

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

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

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)

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

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

但它仅采用Adder类中的方法。这是我可以告诉超类从哪个类评估方法的方法吗?例如,

G.test_func('Adder')
python oop inheritance overriding multiple-inheritance
2个回答
0
投票

继承的工作方式是

  1. 大多数时候,您将获得父类的参考
  2. 子类的实例

根据您的情况,而不是

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

您应该说

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

然后通过G.test_func()调用相应的函数

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


0
投票

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

class Algebra(Adder, Substractor):
    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 == "Substractor":
            return Substractor.test_func(self)
        else:
            raise ValueError("don't know %s" % which)

但是这是一个完整的烂摊子,是继承滥用的完美示例。继承意味着“是”关系,这意味着Base的任何子类都应保留兼容的接口(相同的客户端代码必须能够与任何Base子类的实例相同)-上面没有't。

[现在问自己:是AlgebraAdderSubstractor吗?如果是,则您的设计问题在于test_func()本身。否则(Algebra具有AdderSubstractor),不要继承AdderSubstractor,而应使用合成/委托。

© www.soinside.com 2019 - 2024. All rights reserved.