Python--day25(继承另一种使用方式(继承已经存在的系统提供的类如list类)、多继承、组合、接口、抽象类、鸭子类型)

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

3. 组合

4. 接口

5. 抽象类

6.鸭子类型

猜你喜欢

转载自www.cnblogs.com/wangyong123/p/10881707.html