归一化设计:

    不管是哪一个类的对象,都调用同一个函数去完成相似的功能。

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 抽象类和接口类以及多态的更多相关文章

  1. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  2. Python抽象类和接口类

    一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...

  3. python基础 抽象类(接口类)

    Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...

  4. Python面向对象 | 抽象类和接口类

    一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...

  5. 抽象类,接口类,封装,property,classmetod,statimethod

    抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...

  6. Python进阶-XVII 非python的接口类、多态、python自己的封装

    1.python模拟java中的接口类 python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念 java : 面向对象编程 设计模式 —— 接口 接口类 : ...

  7. php 抽象类和接口类

    PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...

  8. python 抽象类和接口类

    一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名)  ...

  9. PHP的抽象类、接口类的区别和选择【转载】

    本文转自:http://blog.csdn.net/fanteathy/article/details/7309966 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关 ...

随机推荐

  1. HYSBZ - 2005 莫比乌斯反演

    链接 对于gcd(i,j)的位置来说,对答案的贡献是2*(gcd(i,j)-1)+1,所以答案ans ans=Σ(1<=i<=n)(1<=j<=m)2*(gcd(i,j)-1) ...

  2. 【转】Chrome保存mht网页文件的方法 – 无需任何插件,完美!

    本帖原文地址: http://www.ihacksoft.com/chrome-save-mht.html 昨天晚上想要搞定一个 WordPress 自定义文章类型的问题,吃完晚饭后一直呆在办公室里研 ...

  3. IOS-通讯录

    一.通讯录简介 iOS提供了AddressBook.framework框架,允许开发者与设备中的通讯录进行数据交互   二.查询授权状态 可以调用ABAddressBookGetAuthorizati ...

  4. tflearn kears GAN官方demo代码——本质上GAN是先训练判别模型让你能够识别噪声,然后生成模型基于噪声生成数据,目标是让判别模型出错。GAN的过程就是训练这个生成模型参数!!!

    GAN:通过 将 样本 特征 化 以后, 告诉 模型 哪些 样本 是 黑 哪些 是 白, 模型 通过 训练 后, 理解 了 黑白 样本 的 区别, 再输入 测试 样本 时, 模型 就可以 根据 以往 ...

  5. 转:A/B测试:实现方法

    概念:http://www.aliued.cn/2010/09/13/ab-testing-basic-concept.html 我们先来看一个图: (注:感谢Algo提供本图.) 上图展示了 A/B ...

  6. 利用 innodb_force_recovery 解决MySQL服务器crash无法重启问题

    背景      MySQL服务器因为磁盘阵列损坏机器crash,重启MySQL服务时 报如下错误: InnoDB: Reading tablespace information from the .i ...

  7. 使用Jenkins自动编译我的 java 项目 git maven jenkins

    之前的项目已经将jenkins部署好,现在添加maven项目 准备工作 安装插件 Git plugin Publish Over SSH 全局设置  key: 是 linux服务器的私钥 Global ...

  8. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

  9. 压缩JS,提高代码执行速度

    压缩JS java -jar yuicompressor-2.4.jar --type js xxx.js -o xxx.js --charset utf-8 压缩CSS java -jar yuic ...

  10. 基于Python语言使用RabbitMQ消息队列(六)

    远程过程调用(RPC) 在第二节里我们学会了如何使用工作队列在多个工人中分布时间消耗性任务. 但如果我们想要运行存在于远程计算机上的方法并等待返回结果该如何去做呢?这就不太一样了,这种模式就是常说的远 ...