面向对象编程——接口类和抽象类(九)
一、接口类
接口提取了一群类共同的函数,可以把接口当作一个函数的集合。
然后让子类去实现接口中的函数。
这么做的意义在于归一化,什么叫归一化,就是只要基于同一接口实现的类,那么所有这些类产生的对象在使用时,从用法上来说是一样的。
归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象具备某些功能就可以了,这极大的降低了使用者的使用难度。
比如:我们定义一个动物接口,接口里定义了跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你的面前,即使你分辨不清那只是什么鼠,你肯定知道他俩都会跑,都会吃都能呼吸。
#现在有两种支付方式,都有同一种支付方式,而且能够整合,这样使用起来就不用管底层是用何种方式实现的了 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中,并没有接口类这种东西,只能通过抽象类来实现接口类。
在继承抽象类的时候,应该避免多继承,而在继承接口的时候,鼓励多继承接口。