zoukankan      html  css  js  c++  java
  • python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类

    java:面向对象编程
    设计模式 -- 接口类
    
    接口类:python原生不支持
    抽象类:python 原生支持的
    from abc import abstractclassmethod,ABCMeta
    class Payment(metaclass= ABCMeta):         # 元类,默认元类:type
        @abstractclassmethod
        def pay(self, money):
            raise NotImplemented        # 没有实现这个方法
    # Payment 规范:接口类/抽象类
    # 一般使用多继承了,就用接口类
        # 接口类中的所有方法都必须不能实现 -- Java
    # 抽象类不支持多继承
        # 抽象类中可以有一些代码的实现 -- Java
    
    class Wechat(Payment):
        def pay(self, money):
            print('已经使用微信支付了%s元'%money)
    
    class Alipay(Payment):
        def pay(self,money):
            print('已经使用支付宝支付了%s元' % money)
    
    def pay(pay_obj, money):        # 统一支付入口
        pay_obj.pay(money)
    
    class Applepay(Payment):
        def pay(self, money):
            print('已经使用applepay支付了%s元' % money)
    wechat = Wechat()
    # wechat.pay(100)
    
    ali = Alipay()
    # ali.pay(200)
    
    app = Applepay()
    # app.fuqian(199)
    
    pay(wechat,100)
    pay(ali,100)
    pay(app,199)
    tiger:走路,游泳           # 老虎
    swan:走路,游泳,飞      # 天鹅
    oldying:走路,飞          # 老鹰
    from abc import abstractclassmethod,ABCMeta
    class Swim_Animal(metaclass=ABCMeta):
        @abstractclassmethod
        def swim(self):
            pass
    
    class Walk_Animal(metaclass=ABCMeta):
        @abstractclassmethod
        def walk(self):
            pass
    
    class Fly_Animal(metaclass=ABCMeta):
        @abstractclassmethod
        def fly(self):
            pass
    
    class Tiger(Walk_Animal, Swim_Animal):
        def walk(self):
            pass
        def swim(self):
            pass
    
    class Swan(Walk_Animal, Swim_Animal, Fly_Animal):
        def walk(self):
            pass
        def swim(self):
            pass
        def fly(self):
            pass
    class Oldying(Walk_Animal, Fly_Animal):
        def walk(self):
            pass
        def fly(self):
            pass
    # 接口类
        # 原则:接口隔离原则:使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些不需要的接口
        # 面向对象开发的思想、规范

    二. 抽象类

    # 一切皆文件
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            with open('fileName') as f:
                pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    class Txt(All_file):
        pass
    
    t1=Txt() #报错,子类没有定义抽象方法
    class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('文本数据的读取方法')
    
        def write(self):
            print('文本数据的读取方法')
    
    class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的读取方法')
    
    class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的读取方法')
    
    wenbenwenjian=Txt()
    
    yingpanwenjian=Sata()
    
    jinchengwenjian=Process()
    
    #这样大家都是被归一化了,也就是一切皆文件的思想
    wenbenwenjian.read()
    yingpanwenjian.write()
    jinchengwenjian.read()
    
    print(wenbenwenjian.all_type)
    print(yingpanwenjian.all_type)
    print(jinchengwenjian.all_type)
    抽象类:规范
    一般情况下,是单继承,能实现的功能都是一样的 ,所以在父类中可以有一些简单的基础实现
    多继承的情况,由于功能比较复杂,所以不容易抽象出相同的功能的具体实现 写在父类中
    
    不管是抽象类还是接口类:都是面向对象的开发规范
    python中没有接口类。在Java中,有接口interface这个概念,是因为Java中不支持多继承。
        python中自带多继承,所以我们直接用class来实现了接口类
    python中支持抽象类: 一般情况下为 单继承 ,且可以实现python代码
        接口类和抽象类都不能实现实例化
    
    Java:
        java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
        但对于多继承的需求,由于Java本身语法的不支持,所以创建了接口interface这个概念来解决多继承的问题。

    三. 多态

    多态 python 天生支持多态
    其他语言中:
    def func(int num, str name):
        pass
    func(2,'alex')
    
    class Payment():pass
    class Alipay(Payment):
        def pay(self,money):
            print('已经使用支付宝支付了%s元' % money)
    
    def pay(Payment pay_obj, int money):
        pay_obj.pay(money)
    
    class Applepay(Payment):
        def pay(self, money):
            print('已经使用applepay支付了%s元' % money)
    实现了多态
    什么是多态?
    多态指的是一类事物有多种形态
    文件有多种形态:文本文件,可执行文件
    动物有多种形态:人,狗,猪
     python 动态强类型的语言
    python崇尚 鸭子类型
    list tuple
    
    class foo:
        def slice(self):pass
        def index(self):pass
    
    class list(foo):
        def slice(self):pass
        def index(self):pass
    class tuple(foo):
        def slice(self):pass
        def index(self):pass
    鸭子类型不崇尚根据继承所得来的相似
    而是只是自己实现自己的代码就可以了
    如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
    list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的
    优点:松耦合 (每个相似的类之间都没有影响)
    缺点:太随意了,只能靠自觉
    
    
    接口类和抽象类在python中的应用点并不是非常必要

     

    四. 封装

    广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装
    只让自己的对象能调用自己类中的方法
    
    狭义上的封装 -- 面向对象的三大特性之一
    把 属性 和 方法 都藏起来 ,不让你看见
    class Person:
        __key = 123         # 私有的静态属性
        def __init__(self,name, password):
            self.name = name
            self.__password = password              # 私有属性:前面加上双下划线
    
        def __get_pwd(self):                          # 私有方法
            print(self.__dict__)
            return self.__password              # 只要在类的内部使用私有属性,就会自动的带上_类名
    
        def login(self):                    # 正常的方法调用私有的方法
            self.__get_pwd()
    
    
    alex = Person('alex','alex3714')
    # print(alex.__password)
    print(alex.__dict__)            # {'name': 'alex', '_Person__password': 'alex3714'}
    # print(alex._Person__password)       # alex3714    可以这样调,但不能这么用(_类名__属性名)
    alex.__high = 1
    print(alex.get_pwd())           # {'name': 'alex', '_Person__password': 'alex3714', '__high': 1}
    print(alex.__high)
    所有的私有,都是在变量的左边加上双下划线
        对象的私有属性
        类中的私有方法
        类中的静态属性
    所有的私有的,都不能在类的外部使用
  • 相关阅读:
    【转载,待整理】初学 springmvc整合shiro
    【转载并整理】javaweb单点登录
    【转载】linux 测试机器端口连通性方法
    Intellij idea 复制粘贴查找快捷键失效
    intellij 打开node项目 一直停留在scanning files to index....,或跳出内存不够的提示框
    【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)
    【转载并整理】mysql 1293错误 建表两个timestamp
    作用域与闭包:this,var
    在MongoDB中使用JOIN操作
    linux下用top命令查看cpu利用率超过100%
  • 原文地址:https://www.cnblogs.com/lpgit/p/9404620.html
Copyright © 2011-2022 走看看