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):
super().__init__(**kwargs)
if __name__ == '__main__':
d = D(**{"b": 4})
print(d)
|