python动态多重继承__init__

时间:2018-04-20 17:06:37

标签: python class multiple-inheritance

我正在尝试编写一个插件环境,我需要在未知数量的类上进行多次继承。因此,我选择使用类型类创建:

class A(object):
   def __init__(self,s):
      self.a="a"
   def testA(self,x):
      print(x)

class B(object):
   def __init__(self,s):
      self.b="b"
   def testA(self,x):
      print(x)

C = type('C', (A,B), {})

x= C("test")
print x.b

当我运行上面的代码时,我收到错误:

AttributeError: 'C' object has no attribute 'b'

这是因为在初始化C类实例时,只运行A类的 init 。我的问题是如何让C类同时为A类提供 init 以及在初始化C类实例时运行B类的 init 。我确实意识到,如果我像下面那样有C级,那就可以了:

class C(A,B):
    def __init__(self,s):
       A.__init__(self,s)
       B.__init__(self,s)

但是,鉴于我需要继承的动态类列表,这将无效。

1 个答案:

答案 0 :(得分:2)

看起来你正在使用python 2,所以我使用这个旧的python 2 super()语法,你必须指定类和实例,尽管它也适用于python 3。在python 3中,您还可以使用不带参数的较短super()表单。

对于多重继承来说,重要的是祖父母类__init__签名与该方法的所有兄弟姐妹的签名相匹配。为此,请定义一个公共父类(在此示例中为MyParent),其__init__与所有子项具有相同的参数列表。它将负责为我们调用不带任何参数的object __init__

from __future__ import print_function

class MyParent(object):
    def __init__(self, s):
        super(MyParent, self).__init__()

class A(MyParent):
    def __init__(self, s):
        self.a = "a"
        super(A, self).__init__(s)
    def testA(self, x):
        print(x)

class B(MyParent):
    def __init__(self, s):
        self.b = "b"
        super(B, self).__init__(s)

    def testA(self,x):
        print(x)

C = type('C', (A, B), {})

x = C("test")
print(x.b)

您可以根据需要定义任意数量的MyParent子项,如果您正确使用__init__,则会调用所有super()方法。