Python:多继承中的共享方法和属性

时间:2016-09-28 10:20:45

标签: python inheritance

我只想创建一个继承两个父项的属性和方法的类。我们只说两个父类是

class A(object):
    def __init__(self, a):
        self.a = a

    def method_a(self):
        return self.a + 10


class B(object):
    def __init__(self, b):
        self.b = b

    def method_b(self):
        return self.b + 20

然后我不确定如何创建从其父项继承方法和属性的子类C.我可以做这样的事情,但我很确定这不是非常pythonic ...

class C(A, B):
    def __init__(self, a, b):
        A.__init__(self, a=a)
        B.__init__(self, b=b)

然后我可以毫无问题地做到这一点

my_class = C(a=1, b=2)
print(my_class.a)
print(my_class.b)
print(my_class.method_a())
print(my_class.method_b())

我不知道如何设置super来继承父母双方的方法和属性,我将不胜感激!顺便说一下:A类和B类不应该相互依赖。

1 个答案:

答案 0 :(得分:0)

据我所知,super的工作方式是,基于在子类开头声明的超类列表,将制定mro(方法解析顺序)列表。当您调用supper(Python 3)时,将调用__init__列表中第一个类的mro__init__还应包含另一个super(),以便__init__中下一个类的mro也会被调用。

在您的情况下,mro列表应为[A, B]。因此__init__的{​​{1}}必须包含A的调用,以便super的{​​{1}}也被调用。

这里的问题是:

  • 您希望__init__B不相互依赖。使用A需要B列表,如上所述,该列表不满足此要求。
  • super的{​​{1}}有2个参数,而mro__init__的参数只有1.您可以将C传递给{{ 1}}但我不知道您是否有机会将A传递给B

所以在我看来a在这种情况下无法帮助。