栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python多继承方式和顺序

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号