面向对象—多态、鸭子类型(Day21)
编程原则
java具有自己的编程原则和设计模式,不能多继承。
python的编程原则:
1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的)。
2.依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 创建一个规范,抽象类或接口类 metaclass指定的是一个元类
@abstractmethod
def pay(self):pass # 加上装饰器pay变成抽象方法 class Alipay(Payment):
def pay(self,money):
print('使用支付宝支付了%s元' %money)
class QQpay(Payment):
def pay(self,money):
print('使用QQ支付了%s元' %money)
class Wechatpay(Payment):
def fuqian(self,money):
print('使用微信支付了%s元' %money) def pay(obj,money):
obj.pay(money) w = Wechatpay()
pay(w,100) #Can't instantiate abstract class Wechatpay with abstract methods pay
3.接口隔离原则:使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
接口
python中没有接口,接口的概念是Java里来的,因为Java没有多继承,接口可以实现多继承。
借口类的作用:
1.在Java中能够满足接口隔离原则,且完成多继承的约束。
2.在python中,满足借口隔离原则,由于python本身支持多继承,所以就不需要接口这个概念了。
归一化设计:不管是哪个类的对象,都调用同一个函数去完成相似的功能。
class Alipay():
def pay(self,money):
print('使用支付宝支付了%s元' %money)
class QQpay():
def pay(self,money):
print('使用QQ支付了%s元' %money) def pay(obj,money):obj.pay(money)
a = Alipay()
pay(a,100) #用pay这个函数来调用
抽象类和接口类的区别:
1.在python中没什么不同,都是用来约束子类中的方法,只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现,
需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
2.在Java中抽象类的本质是一个类,必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么他只能被一个父类控制。
当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
编程语言分为:
1.强类型语言——Java c++ c# 必须在相同数据类型之间做运算。
2.弱类型语言——shell语言 不同数据类型之间可以运算 如:1+'1'。
3.结余强类型和弱类型之间的语言——python,动态强类型语言,相同数据类型之间做运算。
多态:
由于java语言必须做相同数据类型之间的运算,只能通过继承父类将多个数据类型作为参数传入
java中在一个类(父类)之下发展出来的多个类的对象都可以作为参数传入一个函数或者方法。
python 天生自带多态效果(继承object类)。
class Payment:pass #定义一个父类,下面的多个类都继承父类,数据类型继承父类的传入。 class QQpay(Payment):
def pay(self,money):
print('使用qq支付了%s元' % money)
class Wechatpay(Payment):
def pay(self,money):
print('使用微信支付了%s元' % money)
def recharge(self):pass def pay(Payment pay_obj,int money):
pay_obj.pay(money) qq_obj = QQpay()
qq_obj.pay(100)
pay(qq_obj,100)
鸭子类型
python崇尚鸭子类型,即看起来像,叫起来像,走起路来像鸭子,那么它就是鸭子。不通过具体的继承关系来约束这些类中必须有哪些方法名,是通过一种约定成俗的概念来保证在多个类中相似的功能叫相同的名字。
class QQpay():
def pay(self,money): #看起来相同都叫pay
print('使用qq支付了%s元' % money)
class Wechatpay():
def pay(self,money):
print('使用微信支付了%s元' % money) def pay(pay_obj,money):
pay_obj.pay(money) qq_obj = QQpay()
qq_obj.pay(100)
pay(qq_obj,100)
面向对象—多态、鸭子类型(Day21)的更多相关文章
- 组合+封装+property+多态+鸭子类型(day21)
目录 昨日回顾 继承 什么是继承 继承的目的 什么是抽象 继承背景下,对象属性的查找顺序 派生 什么是派生 子类派生出新的属性,重用父类的属性 新式类和经典类 钻石继承的继承顺序 今日内容 一.组合 ...
- day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)
多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- python之类的多态(鸭子类型 )、封装和内置函数property
一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...
- 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理
''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...
- Python面向对象之鸭子类型
python没有多态?他有什么? 他有鸭子类型. 鸭子类型 : 看着像鸭子,他就是鸭子. 比如一些类,他们中有一些方法,有着相同的功能, 这时为我们将这些相同功能的名字命名为一样的. 那么这些类 都互 ...
- PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型
前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...
- Python面向对象04 /封装、多态、鸭子类型、类的约束、super
Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
随机推荐
- println打印的原理
由于out是System类中的一个不可变的变量 println方法在PrintStream类中 并且在打印都时候都会转换成字符串
- 灵雀云新一期DevOps认证培训圆满结束,下期学员招募同步开启
近日,灵雀云最新一期EXIN DevOps认证培训在北京圆满结束,来自某知名运营商领域ISV的近40名学员以百分百的通过率为此次培训画上圆满的句号. 灵雀云是国内首家在DevOps培训领域与EXIN合 ...
- IDEA导入Web项目配置Tomcat启动
1.导入项目 2.配置project 3.导入项目模块 配置Models 4.配置Libraries 5. 6. 7.配置tomcat
- cesium结合geoserver利用WFS服务实现图层编辑(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- go面试题-基础类
go基础类 1. go优势 * 天生支持并发,性能高 * 单一的标准代码格式,比其它语言更具可读性 * 自动垃圾收集比java和python更有效,因为它与程序同时执行 go数据类型 int stri ...
- golang中的标准库context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...
- Android开发----开发工具的安装与TextView组件
开发工具的安装 选择使用Android Studio进行开发,Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...
- 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)
目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...
- Linux 系统conda环境,pip文件的导出和安装。
/** * 注意:1.在当前的Linux系统中,先生成yaml和requirement.txt文件.通过ssh命令连接到另一台Linux实例.需要先在新的Linux实例上安装 conda.然后再将 y ...
- 【第十四期】高德go面经
自我介绍 选一个比较熟悉的项目讲讲 筛选日志的时候,日志格式是不一样的,你们是如何处理的? 处理日志的时候如果日志量比较大会堆积吗?怎么处理的? 日志落盘到机器上,是如何采集的? 采集服务有问题的话可 ...