• 面向对象编程——接口类和抽象类(九)


    一、接口类

    接口提取了一群类共同的函数,可以把接口当作一个函数的集合。

    然后让子类去实现接口中的函数。

    这么做的意义在于归一化,什么叫归一化,就是只要基于同一接口实现的类,那么所有这些类产生的对象在使用时,从用法上来说是一样的。

    归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象具备某些功能就可以了,这极大的降低了使用者的使用难度。

    比如:我们定义一个动物接口,接口里定义了跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你的面前,即使你分辨不清那只是什么鼠,你肯定知道他俩都会跑,都会吃都能呼吸。

    #现在有两种支付方式,都有同一种支付方式,而且能够整合,这样使用起来就不用管底层是用何种方式实现的了
    class Apple:
        def pay(self,money):
            print("你使用苹果支付付款%s¥"%money)
    
    class alipay:
        def pay(self,money):
            print("你使用支付宝付款%s¥"%money)
    p = Apple()
    z = alipay()
    
    def checkOut(obj,money):
        return obj.pay(money)
    
    checkOut(z,100)
    checkOut(p,100)   #不管你是何种类型都能支付
    
    #结果
    你使用支付宝付款100¥
    你使用苹果支付付款100¥

    现在问题来了,还需要添加多种,怎样让添加的类能够融入到其中了。

    在次就要引入接口类,接口类是规范子类的一个模板,只要接口类中定义,就应该在子类中实现。

    from abc import ABCMeta,abstractclassmethod
    class base_class(metaclass=ABCMeta):
        @abstractclassmethod
        def pay(self,money):
            pass
    
    class Apple(base_class):
        def pay(self,money):
            print("你使用苹果支付付款%s¥"%money)
    
    class Alipay(base_class):
        def pay(self,money):
            print("你使用支付宝付款%s¥"%money)
    
    class Weixing(base_class):  #子类中没有定义pay方法
        def pa(self):
            print("good")
    
    
    w = Weixing()
    w.pa()
    
    结果:
    Traceback (most recent call last):
      File "I:/untitled/cx/11月/11-23/1.面向对象编程(4).py", line 115, in <module>
        w = Weixing()
    TypeError: Can't instantiate abstract class Weixing with abstract methods pay  #大概意思:不能实例化抽象类由于没有pay方法

    标准写法:

    from abc import ABCMeta,abstractclassmethod
    class base_class(metaclass=ABCMeta):
        @abstractclassmethod
        def pay(self,money):
            pass
    
    class Apple(base_class):
        def pay(self,money):
            print("你使用苹果支付付款%s¥"%money)
    
    class Alipay(base_class):
        def pay(self,money):
            print("你使用支付宝付款%s¥"%money)
    
    class Weixing(base_class):
        def pay(self,money):
            print("你使用微信付款%s¥"%money)
    
    w = Weixing()
    p = Apple()
    z = Alipay()
    
    def checkOut(obj,money):
        return obj.pay(money)
    
    checkOut(p,100)
    checkOut(z,100)
    checkOut(w,100)
    
    #结果
    你使用苹果支付付款100¥
    你使用支付宝付款100¥
    你使用微信付款100¥  

    还有一点,接口类不能被实例化

    b = base_class()
    #结果:
    Traceback (most recent call last):
      File "I:/untitled/cx/11月/11-23/1.面向对象编程(4).py", line 124, in <module>
        b = base_class()
    TypeError: Can't instantiate abstract class base_class with abstract methods pay

    二、抽象类

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

    为什么要有抽象类?如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。

    从设计角度来看,如果类是从现实对象抽象而来,那么抽象类就是基于类抽象而来。

    从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。

    在python中,并没有接口类这种东西,只能通过抽象类来实现接口类。

    在继承抽象类的时候,应该避免多继承,而在继承接口的时候,鼓励多继承接口。

  • 相关阅读:
    结构-行为-样式-有趣的函数
    结构-行为-样式-angularJs笔记
    Js-Html 前端系列--页面撑开头尾
    Java 实现下载
    Js-Html 前端系列--Ajax
    Js-Html 前端系列--checkbox
    Nutz中过滤特殊字符
    NUTZ中处理系统未捕获异常
    Thymeleaf 笔记
    Json 使用小结
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7880913.html
Copyright © 2020-2023  润新知