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

一、接口类

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/yangmingxianshen/p/7880913.html