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