首页 > 解决方案 > python类多重继承中的方法覆盖

问题描述

我有一个Base由两个类继承的类Adder,并且subtractor我在其中重写了调用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)

现在我想从超类中或在超类中test_func()选择性地使用该方法。有没有办法可以做到这一点?我试过AdderSubtractorAlgebra

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

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

G.test_func('Adder')

标签: pythonoopinheritanceoverridingmultiple-inheritance

解决方案


获得此结果的唯一方法是重新定义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)——上面没有。

现在问自己:是AlgebraanAdder和 aSubtractor吗?如果是,那么您的设计问题就在于它test_func()本身。否则(anAlgebra有 anAdder和 a Subtractor),不要继承AdderSubtractor而是使用组合/委托。


推荐阅读