zoukankan      html  css  js  c++  java
  • day25,多继承,组合,接口,抽象类和鸭子型

                                                                    多继承,组合,接口,抽象类和鸭子型

    多继承的优点是可以继承到更多的方法和属性,功能强大,
    缺点是在父类中都有相同的方法时候会不知道所要查找的是哪个方法
    所以Python中就有一种算法 就是 c3这种算法来查找,它的查找顺序可以通过 mro 列表查看

    在以前的Python中分位新式类和古典类
    新式类是直接或者间接的继承object类的
    古典类是不直接继承或者换间接继承object这个类的类

    在Python3中所有的类都是新式类,
    古典类在Python2 中有,Python3 中是没有的
    所有在查找方式也是不同的有菱型查找,和多层菱型继承查找

     


    古典类的查找方式是一直找,知道找到公共的父类,如果没有,在依次的查找父类
    新式类是先依次的查找父类,然后在查找父类上面继承的类


    组合

    组合就是把一个类的对象作为另一个类的属性,称之为组合

    class MyList(list):
    
        def __init__(self,types):
            super().__init__()
            self.types = types
    
    
        def append(self, obj):
            if obj.__class__ == self.types:
                super().append(obj)
            else:
                print("只能储存%s类型" % self.types)
    
    m = MyList(int)
    m.append(10)
    print(m)
    class PC:
        def open_app(self,app_name):
            print("open %s" % app_name)
    
    class OldBoyStudent:
        def __init__(self,PC,notebook):
            self.PC = PC
            self.notebook = notebook
        pass
    
    pc = PC()
    notebook = PC()
    
    stu = OldBoyStudent(pc,notebook)
    接口是一套协议规范,具体表现:一堆只有方法声明而没有实现体的方法
    例如USB   
    
    电脑内部具备USB相应的功能 如果要使用的话   就必须给外界提供一个使用方式,该方式就称之为接口 ,
    
    在程序中功能通常是用函数来表示, 对于外界而言 无需清楚函数时如何实现的 只要知道函数名即可, 这个函数名称就可以称之为接口  
    
    外界调用接口就能完成某个任务
    
    接口其实就是一组功能的定义,但是只清楚函数名称,而没有具体的实现细节
    
    相当于是一套规范, 
    
    例如USB   规定了接口的外观,大小,以及每条线路的功能是什么
    
    硬件开发商照着这个USB协议来生产设备,就可以被电脑使用 

    抽象类和抽象方法

    抽象类就是拥有抽象方法是类就是抽象方法,抽象类是必须要有子类覆盖抽象类中的抽象方法,必须要覆盖

    抽象方法是没有具体的实现方法体的方法叫做抽象方法,使用@abc.abstractmethod装饰器修饰的方法是抽象方法

    #使用组合和抽象类和抽象方法来限制一些类继承父类后,有不实现类中的方法
    #所以就是用抽象类来限制继承的类必须实现父类中的方法
    #把一个类转换为抽象类 调用 abc 这个包
    import abc
    
    class USB(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def opened(self):
            pass
        @abc.abstractmethod
        def working(self):
            pass
        @abc.abstractmethod
        def closed(self):
            pass
    
    class Mouse(USB):
        def opened(self):
            print("Mouse opened...")
        def working(self):
            print("Mouse working...")
        def closed(self):
            print("Mouse closed...")
    
    class HT:
        def conntent_device(self,obj):
            obj.opened()
            obj.working()
            obj.closed()
    
    m = Mouse()
    ht = HT()
    ht.conntent_device(m)

    抽象类和接口的去别

    不同点:

    1,抽象类中有一般的函数和抽象函数,

    2,抽象类中的抽象方法必须要覆盖

    3,抽象类是不能实例化的

    4,接口中没有一般的方法,只有抽象方法

    相同点;

    1,他们都需要子类继承,并实现类中的抽象方法

    鸭子型

    对于一个优秀的程序员,即时没有接口和抽象类的限制,也能写出一个具备扩展性的程序 
    
    就如何做到:鸭子类型  
    
    鸭子类型:这个对象 长的想鸭子 叫声像鸭子 走路像鸭子  那它就是鸭子
    
    就可以把它当成鸭子来使用

    总结:可以不用继承抽象类实现抽象方法,自己类中的方法也和另一个类需要的方法一样,那么就可以直接使用这个类
    class Mouse:
        def opened(self):
            print("Mouse opened...")
        def working(self):
            print("Mouse working...")
        def closed(self):
            print("Mouse closed...")
    
    class HT:
        def conntent_device(self,obj):
            obj.opened()
            obj.working()
            obj.closed()
    
    m = Mouse()
    ht = HT()
    ht.conntent_device(m)
    
    
  • 相关阅读:
    Java中使用Lua脚本语言(转)
    lua、groovy嵌入到java中的性能对比(转)
    有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)
    Lua Development Tools (LDT)
    海量数据处理面试题集锦
    三层架构之抽象工厂加反射----实现数据库转换
    八卦一下
    java实现各种数据统计图(柱形图,饼图,折线图)
    activity-alias的使用
    C#反射Assembly 具体说明
  • 原文地址:https://www.cnblogs.com/WBaiC1/p/10882356.html
Copyright © 2011-2022 走看看