Python 3.x:避免从不同的继承类中覆盖相同的方法

时间:2018-04-14 12:39:39

标签: python python-3.x multiple-inheritance

我有以下问题:

我尝试创建一个继承自其他两个类的类,每个类都有内部main方法。作为__setitem__初始化的一部分,我想调用featuresB函数来为该类创建内容。不幸的是,createFeaturesB的调用指的是__setitem__,因为最终可以从两个打印语句的输出中看到。

featuresA.__setitem__

如何避免覆盖这两种方法?

1 个答案:

答案 0 :(得分:2)

有时候首先要考虑是否正确构建了继承图。在这种情况下,撤消继承顺序会修复它。

class C(featuresB, featuresA): # Reverse the inheritance order
    def __init__(self):
        featuresA.__init__(self)
        featuresB.__init__(self)

c = C()
c._dictB # {0: 0, 1: 1, 2: 4}
c._dictA # {}

虽然一般来说,从没有实现支持它的类中获得多个继承是有问题的。您可能希望更新featuresA以使用super

class featuresA():
    def __init__(self):
        self._dictA      = dict()
        super().__init__()

    def __setitem__(self, key, value):
        self._dictA[key] = value
        super().__setitem__(key, value)

class featuresB():
    def __init__(self):
        self._dictB      = dict()
        self.createFeaturesB()

    def __setitem__(self, key, value):
        self._dictB[key] = value

    def createFeaturesB(self):
        for i in range(3):
            self[i] = i**2

class C(featuresA, featuresB):
    def __init__(self):
        super().__init__()

c = C()
c._dictB # {0: 0, 1: 1, 2: 4}
c._dictA # {0: 0, 1: 1, 2: 4}

在更复杂的情况下,你想要从每个类中挑选某些方法,那么你需要重建你的类图,重写你的基类。多重继承是一个强大的工具,但它并不神奇。它将一些责任委托给开发人员。