Python:为什么MRO中的最后一个类的super';s_u_init__;调用,否则将出现运行时异常

Python:为什么MRO中的最后一个类的super';s_u_init__;调用,否则将出现运行时异常,python,multiple-inheritance,Python,Multiple Inheritance,假设类层次结构如下所示,参数中的参数沿着继承链传递,以便所有类都获得所需的参数: class A(object): def __init__(self, **args): print('A.__init__') self.a = args['a'] super(A, self).__init__(**args) class B (object): def __init__(self, **args): print

假设类层次结构如下所示,参数中的参数沿着继承链传递,以便所有类都获得所需的参数:

class A(object):
    def __init__(self, **args):
        print('A.__init__')
        self.a = args['a']
        super(A, self).__init__(**args)


class B (object):
    def __init__(self, **args):
        print('B.__init__')
        self.b = args['b']
        # super(B, self).__init__(**args)

class C(A, B):
    def __init__(self, **args):
        print('C.__init__')
        self.c = args['c']
        super(C, self).__init__(**args)


c = C(a=1, b=2, c=3)
print(c.__dict__)
如果类B使用args调用super的_uinit _uuu,也就是说,取消对此行的注释

# super(B, self).__init__(**args)
,将引发一个异常:

..., in __init__
    super(B, self).__init__(**args)
TypeError: object.__init__() takes no parameters
MRO中的最后一个类似乎无法调用super的_uinit _;,或者只能使用零参数调用它。有人能解释一下原因吗

假设编码器0编写类A和B,然后编码器1编写类C来扩展A和B。既然编码器0不知道实际的MRO,他怎么能决定哪个类应该用args调用super的u_init_uu,哪个不应该


或者有人会分享多重继承和参数传递的最佳实践吗?

A和
B
的基类是
对象
object
是一个不接受参数的类,因为它不处理参数。(你不能写
对象(1)
,可以吗?)

解决这一问题的最佳实践是在传递参数之前删除消耗的参数

class A(object):
    def __init__(self, **args):
        print('A.__init__')
        self.a = args.pop("a")
        super(A, self).__init__(**args)


class B (object):
    def __init__(self, **args):
        print('B.__init__')
        self.b = args.pop("b")
        super(B, self).__init__(**args)

class C(A, B):
    def __init__(self, **args):
        print('C.__init__')
        self.c = args.pop("c") # permanently removes 'c' from args
        super(C, self).__init__(**args)


c = C(a=1, b=2, c=3)
print(c.__dict__)

经历了使用
super()
和多重继承的一些陷阱,以及一些解决方法。谢谢你,Megalng,我现在知道我的代码有什么问题了。但是考虑一下这种情况:A类消耗参数A&D,而B类消耗B&D。在这种情况下,无法决定在何处删除参数d。我的想法是,不要让类A和B直接扩展类对象,而是添加一个“基”类来扩展对象,并将**args作为其_init_的参数,让类A和B扩展基。现在层次结构中的所有类都采用参数**args。@David是的,如果有这种情况,必须这样做。但通常情况下,您需要一个基类,该基类为类a和B使用d