1. 继承另一种使用方式
继承另一种使用方式,在创建一个新类的时候,发现这个类的一些功能在某一个类中已经存在
就没有必要再从头开始写,可以直接继承已有的类,然后做补充。如某一个列表中想要的数据
是已经设定的类型,这样可以设置类直接继承list这个类,再对这个类的数据进行筛选
""" 继承已有的类来扩展新功能 """ # 实现一个存储类,在提供基本的存取功能之外,还要可以限制存储元素的类型 class Mylist(list): def __init__(self,element_cls): # 当覆盖了init方法时,不要忘记使用supei().init让父类完成原有的初始化操作 super().__init__() self.element_cls = element_cls def append(self, object): if object.__class__ == self.element_cls: super().append(object) else: print("只能存储%s类型" % self.element_cls.__name__) ls = Mylist(int) ls.append(10) # [10] ls.append("qwe") # 只能存储int类型 print(ls)
2. 多继承、菱形继承(按照mro列表顺序)
一个类可以同时继承多个父类
好处是更加灵活
出现的问题,属性的查找顺序容易混乱,不好确定
2.1 多继承
""" 多继承下出现了的相同的属性/函数的查找顺序 """ # super在访问父类属性时,查找顺序不能按照眼睛取判断查找顺序,严格按照mro列表的顺序来查看真正的继承顺序 class A: def test(self): print("from A") super().test() # A类没有父类,正常应该报错,但是执行成功了 class B: def test(self): print("from B") class C(A,B): pass c = C() c.test() # from A # from B print(C.mro()) # [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
2.2 菱形继承
菱形继承:一个类有多个父类,多个父类之间又同时继承另一个父类,就产生了菱形继承
经典类:没有继承自object的类就成为经典类,只出现再py2中
新式类:直接或者间接继承了object的类就是新式类,py3全部是新式类,py2中继承了object也就是新式类
在经典类中:查找顺序按照深度优先:E -> B -> A -> C -> D
扫描二维码关注公众号,回复:
6252079 查看本文章
在新式类中:产找顺序按照先深度再广度:E -> B -> C -> D -> A -> object
""" 菱形继承 """ class A: a = 1 pass class B(A): a = 2 pass class C(A): a = 3 pass class D(A): a = 4 pass class E(B,C,D): a = 5 pass e = E() print(e.a) # 新式类:E B C D A object # 经典类:E B A C D