python动态多重继承\uuu init__

python动态多重继承\uuu init__,python,class,multiple-inheritance,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 =

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

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的实例时,如何让类C同时运行类A的init,以及类B的init。我确实意识到,如果我有像下面这样的C类课程,它会起作用:

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

然而,考虑到我需要一个继承类的动态列表,这将不起作用

您似乎在使用python 2,所以我使用了这个旧的python 2
super()
语法,您必须指定类和实例,尽管它在python 3中也可以工作。在Python3中,您还可以使用不带参数的较短的
super()
表单

要使多重继承发挥作用,祖父母类
\uuuuu init\uuuu
签名必须与该方法的所有同级签名相匹配。为此,请定义一个公共父类(
MyParent
,在本例中),该类的
\uuuu init\uuuu
与所有子类具有相同的参数列表。它将负责为我们调用不带任何参数的
对象
\uuu init\uuu

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)

如果正确使用了
super()
,您可以根据需要为
MyParent
定义任意多个子对象,然后将调用所有
\uuu init\uuu
方法。

看起来您使用的是Python2,所以我使用了这个旧的Python2
super()
语法,其中必须指定类和实例,尽管它在Python3中也可以工作。在Python3中,您还可以使用不带参数的较短的
super()
表单

要使多重继承发挥作用,祖父母类
\uuuuu init\uuuu
签名必须与该方法的所有同级签名相匹配。为此,请定义一个公共父类(
MyParent
,在本例中),该类的
\uuuu init\uuuu
与所有子类具有相同的参数列表。它将负责为我们调用不带任何参数的
对象
\uuu init\uuu

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)

如果正确使用了
super()
,您可以定义任意多个子对象到
MyParent
,然后将调用所有
\uuu init\uuu
方法,这正是针对这种情况的。谢谢你的回答。你能告诉我为什么在我的父对象的init中有一个super吗?它调用
对象。。。它什么都不做,但你不应该指望它什么都不做。这是父类的初始化,因此您应该始终调用它谢谢您的回答。你能告诉我为什么在我的父对象的init中有一个super吗?它调用
对象。。。它什么都不做,但你不应该指望它什么都不做。它是父类的初始化,因此您应该始终调用它