day23-多态和

# 多态

什么是多态?

# 一种事物具备多种不同的形态
例如:水 固态 气态 液态
​大黄蜂:汽车人,汽车,飞机
# 官方解释: 多个不同类对象可以响应同一个方法,产生不同的结果
首先强调多态不是一种特殊的语法,而是一种状态,特性(既多个不同对象可以响应同一个方法,产生不同的结果),既多个对象有相同的使用方法

 

 

为什么要用多态?

# 对于使用者而言,大大的降低了使用难度,我们之前写的USB接口下的鼠标,键盘,就属于多态

 

怎么实现多态?

# 接口 抽象类 鸭子类型 都可以写出具备多态的代码,最简单的就是鸭子类型

 

案例:

# 多态,不同的对象响应同一个方法,产生不同的结果,吃,走,下蛋class Ji:def dawn(self):print("咯咯咯")def egg(self):print("下鸡蛋")class Duck:def dawn(self):print('嘎嘎嘎')def egg(self):print('下鸭蛋')class E:def dawn(self):print("饿饿饿")def egg(self):print('下鹅蛋')j = Ji()
y = Duck()
e = E()def manage(obj):obj.dawn()def get_egg(obj):obj.egg()manage(j)
manage(y)
manage(e)
get_egg(j)
get_egg(y)
get_egg(e)

 

 

OOP中的内置函数

isinstance

# 判断一个对象是否是某个类的实例
  参数1 要判断的对象参数2 要判断的类型

 

运用

def add_num(a, b):if isinstance(a, int) and isinstance(b, int):return a + breturn Noneprint(add_num(23, 97))
print(add_num(12.7, 76))

 

 

## issubclass

#  判断一个类是否是另一个类的子类
   参数一是子类参数二是父类

 

运用

class Animal:def eat(self):print("动物得吃东西...")class Pig(Animal):def eat(self):print("猪得吃 猪食....")class Tree:def light(self):print("植物光合作用....")pig = Pig()
t = Tree()def manage(obj):if issubclass(type(obj), obj):obj.eat()else:print("不是一头动物!")manage(pig)manage(t)

 

类中的魔法函数

str

__str__ 会在对象被转换为字符串时,转换的结果就是这个函数的返回值 
使用场景:我们可以利用该函数来自定义,对象的是打印格式

 

运用

import timeclass Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return "这是一个person对象,name:%s,age:%s" % (self.name, self.age)def __del__(self):print("del run")p = Person('jack', 20)time.sleep(2)print('over')

del

# 执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行 
# 使用场景:当你的对象在使用过程中,打开了不属于解释器的资源:例如文件,网络端口 

使用案例

class FileTool:
"""该类用于简化文件的读写操作 """def __init__(self,path):
self.file = open(path,"rt",encoding="utf-8")
self.a = 100def read(self):
return self.file.read()# 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了
def __del__(self):
self.file.close()tool = FileTool("a.txt")
print(tool.read())

call

# 执行时机:在调用对象时自动执行,(既对象加括号)

 

使用

#call 的执行时机
class A:def __call__(self, *args, **kwargs):print("call run")print(args)print(kwargs)a = A()
a(1,a=100)

 

slots

# 该属性是一个类属性,用于优化对象内存占用,优化的原理,将原本不固定的属性数量,变得固定了,这样的解释器就不会为这个对象创建名称空间,所以__dict__也没了,从而达到减少内存开销的效果 
# 另外当类中出现了slots时将导致这个类的对象无法在添加新的属性

slots的使用

class Person:__slots__ = ["name"]
def __init__(self,name):
self.name = namep = Person("jck")# 查看内存占用
# print(sys.getsizeof(p))
# p.age = 20 # 无法添加# dict 没有了
print(p.__dict__)

 

getattr setattr delattr

# getattr 用点访问属性的时如果属性不存在时执行
# setattr 用点设置属性时
# delattr 用del 对象.属性 删除属性时 执行
这几个函数反映了 python解释器是如何实现 用点来访问属性getattribute 该函数也是用来获取属性
在获取属性时如果存在getattribute则先执行该函数,如果没有拿到属性则继续调用 getattr函数,如果拿到了则直接返回

[] 的实原理

# getitem setitem delitem
任何的符号 都会被解释器解释成特殊含义 ,例如 . [] ()getitem 当你用中括号去获取属性时 执行
setitem 当你用中括号去设置属性时 执行
delitem 当你用中括号去删除属性时 执行

运算符重载

# 当我们在使用某个符号时,python解释器都会为这个符号定义一个含义,同时调用对应的处理函数, 
# 当我们需要自定义对象的比较规则时,就可在子类中覆盖 大于 等于 等一系列方法....

 

案例:

原本自定义对象无法直接使用大于小于来进行比较 ,我们可自定义运算符来实现,让自定义对象也支持比较运算符

class Student(object):def __init__(self,name,height,age):self.name = nameself.height = heightself.age = agedef __gt__(self, other):# print(self)# print(other)# print("__gt__")return self.height > other.heightdef __lt__(self, other):return self.height < other.heightdef __eq__(self, other):if self.name == other.name and  self.age == other.age and self.height == other.height:return Truereturn Falsestu1 = Student("jack",180,28)
stu2 = Student("jack",180,28)
# print(stu1 < stu2)
print(stu1 == stu2)

 

 

上述代码中,other指的是另一个参与比较的对象,

大于和小于只要实现一个即可,符号如果不同 解释器会自动交换两个对象的位置

 

迭代器协议

# 迭代器是指具有__iter__和__next__的对象
我们可以为对象增加这两个方法来让对象变成一个迭代器

 

案例

class MyRange:def __init__(self,start,end,step):self.start = startself.end = endself.step = stepdef __iter__(self):return selfdef __next__(self):a = self.startself.start += self.stepif a < self.end:return aelse:raise StopIterationfor i in MyRange(1,10,2):print(i)

 

上下文管理

# 上下文 context
这个概念属于语言学科,指的是一段话的意义,要参考当前的场景,既上下文 
在python中,上下文可以理解为是一个代码区间,一个范围 ,例如with open  打开的文件仅在这个上下文中有效 
涉及到的两个方法:# enter
表示进入上下文,(进入某个场景 了)
# exit
表示退出上下文,(退出某个场景 了)当执行with 语句时,会先执行enter ,
当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息
包含错误的类型.错误的信息.错误的追踪信息

 

 

注意

enter 函数应该返回对象自己 
exit函数 可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用
如果为True 则意味着,异常以及被处理了 
False,异常未被处理,程序将中断报错

 

 

# 对于使用者而言,大大的降低了使用难度,我们之前写的USB接口下的鼠标,键盘,就属于多态

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11265143.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《科学》:中国科学家揭示,人脑中间神经元多样性从何而来?

来源&#xff1a;学术经纬编辑&#xff1a;药明康德内容团队编辑 在我们的大脑皮层中&#xff0c;有两类神经元源自发育的端脑结构。除了兴奋性神经元&#xff0c;中间神经元是另一类重要的神经元&#xff0c;它们可以通过释放γ&#xff0d;氨基丁酸&#xff08;GABA&#xf…

快速入门虚拟机+linux安装(附带视频)

配合视频食用更佳哦~ 01_虚拟机Linux 快速入门 02_手把手教你安装centos7&#xff08;不会你来打我&#xff09; 这是bai du yun 群链接&#xff0c;存放UP主视频中的那个“开箱即用”虚拟机文件压缩包 https://pan.baidu.com/s/4hwvNmIS 文章目录下载地址概念介绍关于虚拟机&a…

Insert语句

问&#xff1a; 问题是&#xff1a;&#xff1a;未处理System.Data.OleDb.OleDbException HResult-2147217900 Message语法错误 (操作符丢失) 在查询表达式 2014/12/1 0:00:00 中。 public void add(string addselect){oledbconn dataconn.getcon();oledbconn.Open();OleD…

03_linux 常用命令(上)

声明&#xff1a;此文档中的部分内容来自于培训班笔记&#xff0c;如有侵权&#xff0c;请联系UP主&#xff0c;即刻删除视频。03_linux 常用命令&#xff08;上&#xff09; 配合视频食用更佳哦~&#xff08;点击蓝色字样&#xff0c;查看up主录制的视频&#xff09; 内容要…

多模态AI崛起,2022年人工智能5大发展趋势

来源&#xff1a;CSDNnews转自&#xff1a;中国机器人网前言国外一家专注于开源和堆栈技术新闻网站 TheNewStark 盘点出 2022 年值得人们期待的五个人工智能发展趋势。随着深度学习的开放&#xff0c;人工智能在几年中快速发展&#xff0c;尖端技术慢慢向普及应用到各行各业。以…

OpenStack组件——Keystone身份认证

1.keystone介绍 keystone 是OpenStack的组件之一&#xff0c;用于为OpenStack家族中的其它组件成员提供统一的认证服务&#xff0c;包括身份验证、令牌的发放和校验、服务列表、用户权限的定义等等。云环境中所有的服务之间的授权和认证都需要经过 keystone. 因此 keystone 是云…

1_RabbitMQ初入门入门Hello消费者+生产者

文章目录1_RabbitMQ初入门1.RabbitMQ的介绍1.工作原理&发送/接收消息的流程2. 为什么要使用消息队列&#xff1f;3.使用了消息队列有什么缺点&#xff1f;2.安装RabbitMQ3.入门程序Hello_消费者&生产者_1.导入依赖2.生产者1.设置连接信息2.获取connection&#xff08;连…

《Nature》:衰老后的核糖体发生了哪些致病变化

来源&#xff1a;生物通研究发现&#xff0c;产生蛋白质的细胞装配线会随着年龄的增长而停滞&#xff0c;从而引发雪球效应&#xff0c;增加错误折叠蛋白质的产量。在人类中&#xff0c;成堆的错误折叠蛋白质会导致与年龄相关的阿尔茨海默病和帕金森病。衰老会损害核糖体有效合…

[转载]eXeScope 6.50本地溢出分析

作 者: humourkyo时 间: 2009-03-30,21:03链 接: http://bbs.pediy.com/showthread.php?t84975无聊逛了下http://www.milw0rm.com 看最近有什么ODAY没&#xff0c;顺便挑一个分析下玩玩。于是就看到了这个http://www.milw0rm.com/exploits/8270是eXeScope 6.50 Local Buffer O…

饶毅:中国脑计划是我见过的最差科学经费管理,中国猴计划应该缓行

左&#xff1a;饶毅 右&#xff1a;蒲慕明来源&#xff1a;饶议科学 作者&#xff1a;饶毅原标题&#xff1a;中国猴计划应该缓行在我国上上下下左左右右普遍对支持科学研究有广泛共识&#xff0c;在我国具备一定支持科学研究的经济条件的情况下&#xff0c;科技部正在推动最大…

CSS每日学习笔记(0)

7.29.2019 1. CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部样式表通常存储在 CSS 文件中 多个样式定义可层叠为一…

2_RabbitMQ工作模式_Work queues_Publish/Subscribe_Routing_Topics_HeaderRpc

文章目录2_RabbitMQ工作模式1.Work queues2.Publish/Subscribe1.工作模式2.代码1.生产者1.指定消息队列相关消息2.建立连接&绑定队列3.发送消息完整代码&#xff1a;2.消费者1.指定消息队列相关消息2.建立连接&绑定队列3.实现消费方法&监听消息完整代码3.小结3.Rou…

1000亿美元!英特尔要在美国建世界最大芯片厂,美520 亿美元芯片法案接近敲定...

来源&#xff1a;新智元编辑&#xff1a;桃子 拉燕 时光1000亿美元芯片计划&#xff0c;要重振英特尔往日雄风&#xff01;路透称&#xff0c;英特尔将投资200亿美元建设2家芯片制造工厂&#xff0c;并计划最终投资多达1000亿美元。新工厂的建设将于今年晚些时候开始&#xff0…

Vue 组件间通信六种方式

前言 组件是 vue.js最强大的功能之一&#xff0c;而组件实例的作用域是相互独立的&#xff0c;这就意味着不同组件之间的数据无法相互引用。一般来说&#xff0c;组件可以有以下几种关系&#xff1a; 如上图所示&#xff0c;A 和 B、B 和 C、B 和 D 都是父子关系&#xff0c;C …

vue-day01-vue模板语法

文章目录Vue 是什么&#xff1f;使用Vue将helloworld 渲染到页面上指令v-cloakv-textv-htmlv-pre**v-once**双向数据绑定v-modelmvvmv-onv-on事件函数中传入参数事件修饰符按键修饰符自定义按键修饰符别名小案例-简单计算器v-bind绑定对象绑定class绑定对象和绑定数组 的区别绑…

IEEE Spectrum调查:AI 的 6 种最坏情况

来源&#xff1a;AI科技评论编译&#xff1a;辛西娅审核&#xff1a;维克多对于人类社会&#xff0c;人工智能&#xff08;AI&#xff09;带来的最大威胁是什么&#xff1f;好莱坞科幻电影的“想象”提供了答案&#xff1a;它逐渐进化&#xff0c;获得人类思考能力&#xff0c;…

day24 反射\元类

反射 reflect # 什么是反射, 其实是反省,自省的意思,反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力. # 反射就是通过字符串操作属性,涉及的四个函数,这四个函数就是普通的内置函数,没有双下划綫,与print等等没有区别. 案例 hasattr getattr setattr delattr p …

212页PPT详解MEMS微传感器的工作原理(深入全面!)

来源&#xff1a;传感器专家网本文是关于MEMS微传感器的工作原理最全面的内容&#xff0c;分为两部分&#xff0c;共计212页PPT内容。主要讲解了MEMS微传感器的概念、分类&#xff0c;基本敏感原理介绍&#xff0c;MEMS微传感器实例、MEMS微执行器分类、基本致动方式介绍、微执…

C++开发WPF,开发环境配置

C开发WPF&#xff0c;开发环境配置 操作系统:Windows XP SP2, Windwos Vista开发工具:Visual Studio 2005&#xff0c;Expression BlendSDK:.NET Framework 3.0或以上不需要其它的了&#xff0c;比C#开发WPF少了一些。但是需要自己手工打造一些代码&#xff0c;也有不少乐趣在里…

Lucene-01 全文检索基本介绍

文章目录课程计划什么是全文检索数据分类结构化数据搜索非结构化数据查询方法如何实现全文检索全文检索的应用场景Lucene实现全文检索的流程索引和搜索流程图创建索引获得原始文档创建文档对象分析文档创建索引查询索引用户查询接口创建查询执行查询渲染结果全文检索技术Lucene…