python多继承方式和顺序

python 中继承方式有两种:深度优先、广度优先。
在这里插入图片描述
如图,B 继承 A, C 继承 A, D 继承 B 和 C。

深度优先遍历是从 D 开始往上搜索到 B,若 B 没有数据,则继续往上搜索到 A;

广度优先遍历是从 D 开始往上搜索到 B,若 B 没有数据,则搜索和 B 同级的 C 里的数据,若同级的 C 里还是没有数据,再继续往上搜索到 A

注:py2 经典类是按深度优先来继承的,新式类是按广度优先来继承的。
py3 经典类和新式类都是统一按广度优先来继承的。


class RootModel:
    _mapping_info = {}

    def __init__(self, **kwargs):
        """
        定义最基本的初始化方式
        :param kwargs: 参数字典
        """
        for k, v in kwargs.items():
            key = self.__class__._load_mapping_info(k)
            if key in self.__dict__.keys():
                self.__setattr__(key, v)

    @classmethod
    def _load_mapping_info(cls, key):
        """
        获取字段映射
        :param key: 键
        :return: 映射后的键
        """
        if key in cls._mapping_info.keys():
            return cls._mapping_info.get(key)
        else:
            return key


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


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


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


class D(B, C):
    def __init__(self, **kwargs):
        # self.d = []
        super().__init__(**kwargs)


if __name__ == '__main__':
    d = D(**{"b": 4})
    print(d)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值