zoukankan      html  css  js  c++  java
  • 面向对象编程——接口类和抽象类(九)

    一、接口类

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

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

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

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

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

    #现在有两种支付方式,都有同一种支付方式,而且能够整合,这样使用起来就不用管底层是用何种方式实现的了
    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中,并没有接口类这种东西,只能通过抽象类来实现接口类。

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

  • 相关阅读:
    项目上线前的优化
    vue项目打包上线流程以及遇到的问题
    js放大镜
    vue中mixins(混入)的使用
    vue中的provide和inject (依赖注入)
    Vue Virtual Dom 和 Diff原理
    vue 过滤器
    vue自定义指令的使用场景
    php---前后端分离跨域问题的解决
    PHP---for、while、foreach性能比较
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7880913.html
Copyright © 2011-2022 走看看