面向对象编程——接口类和抽象类(九)
2017-11-26 03:33
274 查看
一、接口类
接口提取了一群类共同的函数,可以把接口当作一个函数的集合。
然后让子类去实现接口中的函数。
这么做的意义在于归一化,什么叫归一化,就是只要基于同一接口实现的类,那么所有这些类产生的对象在使用时,从用法上来说是一样的。
归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象具备某些功能就可以了,这极大的降低了使用者的使用难度。
比如:我们定义一个动物接口,接口里定义了跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你的面前,即使你分辨不清那只是什么鼠,你肯定知道他俩都会跑,都会吃都能呼吸。
#现在有两种支付方式,都有同一种支付方式,而且能够整合,这样使用起来就不用管底层是用何种方式实现的了 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中,并没有接口类这种东西,只能通过抽象类来实现接口类。
在继承抽象类的时候,应该避免多继承,而在继承接口的时候,鼓励多继承接口。
相关文章推荐
- 写个简单例子人吃饭,体现面向对象编程,包含接口,抽象类的用处。
- 面向对象编程中接口与抽象类的比较
- php面向对象编程:抽象类与接口的区别
- C#温故而知新学习系列之面向对象编程—接口和抽象类的区别是什么?(十八)
- C#温故而知新学习系列之面向对象编程—接口和抽象类的区别是什么?(十八)
- 《你必须知道的.NET》--面向对象编程:接口和抽象类(Ⅱ)
- Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
- 18天Java学习---15.面向对象编程10-Java中final关键字,抽象类与接口
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
- 抽象类和接口的区别
- C#中抽象类和接口的区别
- JavaLearning:适配器设计 接口和抽象类
- 接口 interface 接口和抽象类的比较
- 抽象类与接口的区别
- c#接口和抽象类的区别
- 接口与抽象类的区别
- 抽象类 接口的区别
- C#接口和抽象类的特点
- Java语言中的----抽象类、接口