• 面向对象的接口类和抽象类


    1.接口类

    继承有两种用途:

    一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)  

    二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

    class Alipay:
        '''
        支付宝支付
        '''
        def pay(self,money):
            print('支付宝支付了%s元'%money)
    
    class Applepay:
        '''
        apple pay支付
        '''
        def pay(self,money):
            print('apple pay支付了%s元'%money)
    
    
    def pay(payment,money):
        '''
        支付函数,总体负责支付
        对应支付的对象和要支付的金额
        '''
        payment.pay(money)
    
    
    p = Alipay()
    

      开发中容易出现的问题

    class Alipay:
        '''
        支付宝支付
        '''
        def pay(self,money):
            print('支付宝支付了%s元'%money)
    
    class Applepay:
        '''
        apple pay支付
        '''
        def pay(self,money):
            print('apple pay支付了%s元'%money)
    
    class Wechatpay:
        def fuqian(self,money):
            '''
            实现了pay的功能,但是名字不一样
            '''
            print('微信支付了%s元'%money)
    
    def pay(payment,money):
        '''
        支付函数,总体负责支付
        对应支付的对象和要支付的金额
        '''
        payment.pay(money)
    
    
    p = Wechatpay()
    pay(p,200)   #执行会报错
    

      接口初成:手动报异常:NotImplementedError来解决开发中遇到的问题

    class Payment:
        def pay(self):
            raise NotImplementedError
    
    class Wechatpay(Payment):
        def fuqian(self,money):
            print('微信支付了%s元'%money)
    
    
    p = Wechatpay()  #这里不报错
    pay(p,200)      #这里报错了
    

      借用abc模块来实现接口

    from abc import ABCMeta,abstractmethod
    
    class Payment(metaclass=ABCMeta):
        @abstractmethod
        def pay(self,money):
            pass
    
    
    class Wechatpay(Payment):
        def fuqian(self,money):
            print('微信支付了%s元'%money)
    
    p = Wechatpay() #不调就报错了
    

      

    实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

    继承的第二种含义非常重要。它又叫“接口继承”。
    接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

       2.抽象类

    什么是抽象类?

           抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

    为什么要有抽象类

         如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性。在python中实现抽象类

    #一切皆文件
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            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)
    

      抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

    继承小结

       几个名词

    抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
    继承:子类继承了父类的方法和属性
    派生:子类在父类方法和属性的基础上产生了新的方法和属性
    

      

  • 相关阅读:
    [Golang] 解决 Goland配置GOROOT The selected directory is not a valid home for Go Sdk
    gin bind(重要)
    如何优雅的限制 Kubernetes 节点上运行的 Pod 数量
    postman中 formdata、xwwwformurlencoded、raw、binary的区别
    idea 脚手架
    baselines算法库baselines/bench/monitor.py模块分析
    【转载】 tensorflow变量默认是如何进行初始化的?
    【转载】 pytorch锁死在dataloader(训练时卡死)
    baselines算法库common/retro_wrappers.py模块分析
    使用TensorFlow、Pytorch等深度学习框架时如何设置对OpenCV的使用
  • 原文地址:https://www.cnblogs.com/hanxiaofeicf/p/7391414.html
Copyright © 2020-2023  润新知