首页 > 解决方案 > 使用 kwargs 进行多重继承

问题描述

问题

我在Dusty Phillips的面向对象编程中遇到了这段代码(为简洁起见),我不确定这个定义的特定部分。

class A:
    def __init__(self, a, **kwargs):
        super().__init__(**kwargs)
        self.a = a

class B:
    def __init__(self, b, **kwargs):
        super().__init__(**kwargs)
        self.b = b

class C(A, B):
    def __init__(self, c, **kwargs):
        super().__init__(**kwargs)
        self.c = c

问题

  1. 既然方法解析顺序是(__main__.C, __main__.A, __main__.B, object), 可以class B改为下面的方式定义吗?
class B:
    def __init__(self, b):
        self.b = b
  1. 不是多余super().__init__(**kwargs)class B,因为任何多余kwargs的传递给C将传递给object,提高?

TypeError: object.__init__() 只接受一个参数(要初始化的实例)

  1. 这是 ifC被定义为class C(B, A)而不是的保障class C(A, B)吗?

标签: pythonoopmultiple-inheritance

解决方案


考虑如何实例化C

c = C(a=3, b=5, c=9)

C.__init__获取所有关键字参数,但只使用一个作为自己的参数c。其余的将传递给__init__链中的下一个方法。在这种情况下,那是A.__init__,它“拉出”参数a并传递bB.__init__B使用它并将(现在为空的)关键字参数集传递给下一个方法,object.__init__. 因为所有关键字参数都已“声明”并由其他类处理,所以object.__init__成功。

由于 MRO 的构造方式,正确使用super()保证的到那时**kwargs将是空的object.__init__


推荐阅读