python's twenty-first day for me 抽象类和接口类以及多态
归一化设计:
不管是哪一个类的对象,都调用同一个函数去完成相似的功能。
class Alipay:
def pay(self,money):
print('使用支付宝支付了%s' % money) class QQpay:
def pay(self,money):
print('使用QQ支付了%s元' % money) def pay(way,money): # 以上两个类都使用了pay方法去完成相似的功能,
way.pay(money) # 所以可定义一个***相同的函数名***来完成这个功能,这种就叫做归一化设计。 a = Alipay()
q = QQpay()
pay(a,100) # 使用支付宝支付了100
pay(q,100) # 使用QQ支付了100元
依赖倒置原则:
高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现变成。
抽象类: 是python中定义类的一种规范。
如果遇到抽象类 记得按照抽象类中的规范一一实现对应的方法。
抽象即抽取类似或者说比较像的部分。抽象最主要的作用就是划分类别,抽象知识分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类。抽象是一种特殊的类,它的特殊之处在于只能被继承,不能被实例化。
抽象类的本质还是类,指的是一组类的相似性,包括数据属性和函数属性。
接口类:
接口类只强调函数属性的相似性,python中并没有接口类这种概念。
接口类的概念来自于JAVA,
java类没有多继承,所以用接口,接口可以实行按多继承。
接口隔离原则:
使用多个专门的接口,而不使用单一的总接口。
接口提取了一群类共同的函数,可以把接口当做一个函数的集合。 然后让子类去实现接口中的函数。 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。 归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。 比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样
为何使用接口类
# 描述动物园
# 会游泳的 会走路的 会爬树的 会飞的
# 老虎
# 青蛙
# 天鹅
# 猴子 # 所有会飞的动物 具有一些会飞的动物的特性
# 所有会走的动物 具有一些会走的动物的特性 from abc import ABCMeta,abstractmethod
class FlyAnimal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
@abstractmethod
def cal_fly_speed(self):pass
@abstractmethod
def cal_fly_height(self):pass
class WalkAnimal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class SwimAnimal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass
class Tiger(WalkAnimal,SwimAnimal):
def walk(self):pass
def swim(self):pass
class Monkey(WalkAnimal):
def walk(self):pass
def climb(self):pass
class Swan(FlyAnimal,WalkAnimal,SwimAnimal):
def swim(self):pass
def walk(self):pass
def fly(self):pass
def cal_fly_speed(self):pass
def cal_fly_height(self):pass
接口类的作用:
在java中,能够满足接口隔离原则,且完成多继承的约束。
在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念。
抽象类和接口类做的事情:建立规范,制定一个类的metaclass是ABCMeta,那么这个类就变成了一个抽象类(接口类),这个类的主要功能就是建立一个规范,抽象类中所有被abstractmethod装饰的方法都必须被继承的子类实现,否则就会在实例化阶段就会报错。
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
@abstractmethod
def pay(self,money):pass # 抽象方法 规定此类下的字类都必须拥有pay这个方法名。 class Alipay(Payment): # 继承 Payment
def pay(self,money): # 方法名必须是pay
print('使用支付宝支付了%s元' % money) class QQpay(Payment): # 继承 Payment
def pay(self,money): # 方法名必须是pay
print('使用QQ支付了%s元' % money) class Wechatpay(Payment): # 继承 Payment
def pay(self,money): # 方法名必须是pay
print('使用微信支付了%s元' % money) a = Alipay()
q = QQpay()
w = Wechatpay()
a.pay(100) # 使用支付宝支付了100元
q.pay(100) # 使用QQ支付了100元
w.pay(100) # 使用微信支付了100元
总结:无论是抽象类还是接口类metaclass = ABCMeta 都不可以被实例化。
抽象类和接口类:
在python中:
1,并没有什么不同,都是用来约束子类中的方法的。
2,只要抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现。
3,需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
在java中:
1,抽象类和接口截然不同。
2,抽象类的本质还是一个类,是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制。
3,当多个类之间有相同的功能也有不同的功能的时候 java 只能用接口来解决问题。
多态:
java c++ c# ----- 强类型语言。传入参数必须表明是什么类型的参数。
如:def func(int a) : pass
相同数据类型之间做运算。
shell语言 -----弱类型语言。如:可以直接运算 1+‘1’
介于 强类型 与 弱类型 之间 ----- python 动态强类型语言。
相同数据之间类型之间做运算。
java 多态:在一个类之下发展出来的多个类的对象都可传入以作为参数传入。
无论是python2x,python3x 都天生自带多态效果。
多态和鸭子类型:
多态通过继承实现:
java在一个类之下发展出来的多各类的对象都可以作为参数传入一个函数或者方法。
在python中不需要可以实现多态,因为python本身自带多态效果。
鸭子类型:
不是通过具体的继承关系来约束某些类中必须有哪些方法名。
是通过一种约定俗成的概念来保证在多个类中相似的功能叫相同的名字。
python's twenty-first day for me 抽象类和接口类以及多态的更多相关文章
- python之路----继承的抽象类和接口类
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Python抽象类和接口类
一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...
- python基础 抽象类(接口类)
Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...
- Python面向对象 | 抽象类和接口类
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...
- 抽象类,接口类,封装,property,classmetod,statimethod
抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...
- Python进阶-XVII 非python的接口类、多态、python自己的封装
1.python模拟java中的接口类 python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念 java : 面向对象编程 设计模式 —— 接口 接口类 : ...
- php 抽象类和接口类
PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...
- python 抽象类和接口类
一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名) ...
- PHP的抽象类、接口类的区别和选择【转载】
本文转自:http://blog.csdn.net/fanteathy/article/details/7309966 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关 ...
随机推荐
- ICE 中后台开发
1.https://alibaba.github.io/ice/#/block 2.https://www.zhihu.com/question/266529857/answer/309604282 ...
- week05《Java程序设计》第五次学习总结
week05<Java程序设计>第五次学习总结 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键词:接口,inteface关键词,implement关键词, ...
- Visual Studio 2008常见问题
1.asp.net在什么软件上运行?学习asp往往需要测试asp程序,电脑不能直接测试,需要装IIS才能运行,但装IIS要么需要安装盘,要么需要安装包,而且设置也很复搜索杂.这里给大学推荐两个替代II ...
- PostgreSQL EXPLAIN执行计划学习--多表连接几种Join方式比较
转了一部分.稍后再修改. 三种多表Join的算法: 一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表 ...
- jdk1.8 HashMap 实现 数组+链表/红黑树
转载至 http://www.cnblogs.com/leesf456/p/5242233.html 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Ja ...
- 5.linux目录结构介绍
目录: 1.linux系统的目录结构特点?为何会形成这样的目录结构? 2.基本目录内容详解! 3.重要目录详解! 1.linux系统的目录结构特点? A.Linux系统的目录结构是一棵倒挂的大树,”/ ...
- (二)java环境搭建
Java运行环境的搭建: 什么是JRE,什么是JDK? JRE:(java运行环境)包括jvm(java虚拟机)和java运行的核心类库,如果只是运行java程序,只需安装JRE JDK:(java开 ...
- 【占位】HihoCoder1317 跳舞链
跳舞链 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近遇到一个难题,他需要破解一个棋局. 棋局分成了n行,m列,每行有若干个棋子.小Ho需要从中选择若干行使得 ...
- PCB 封装中的 公差符号形位公差位置度
PCB 封装中的 公差符号形位公差位置度 0.08 旁边的 十字加圆就是位置度的形位公差.
- 主窗体上按钮jig画图时,CAD得不到焦点的问题
主窗体上按钮jig画图时,CAD得不到焦点的问题 按钮不要用 Click 事件,用 MouseDown 事件, 可完美解决该问题 1.试过CAD窗体获得焦点,不顶用 2.试用用命令行去执行,可行 ...