当前课程知识点:计算思维与人工智能基础 > 第三部分:python基础 > 第六章:函数、模块与面向对象 > 6.3魔法函数的应用
下面我们给大家介绍一下Python中的魔法函数
我们在前面定义类的时候
大家用过这个_init_这样的函数的定义
那么这个函数呢
它定义好的是在类实例化的时候它会自动执行
所以说我们可以看到
在Python中内置的以双下划线开始和结束的这些函数呢
都称之为魔法函数
那么魔法函数它的作用和特点是什么呢
那魔法函数是可以为所写的类增加一些额外的功能
每个魔法方法呢
都是在对内建方法
比如说str这样的一个重写
在自定义的类中可以实现之前的内置函数
那么在执行特定的操作的时候呢
它可以自动调用这个魔法函数
我们举一个例子
假如我们要定义一个人的类people
那他本身有属性
name和age
那么需要利sorted对我们people这个数组进行排序
那么排序的规则是按name和age同时排序
那如果name不同的时候呢就比较name
如果相同的时候呢就比较age
那由于people类呢本身不具有比较功能
所以我们要定义一些内部的函数来进行比较
那我们来看一下
我们需要定义这个class People
我们可以看得到它是一个集成object 这样的一个类
那我们首先定义它的init
那么init这个构造函数的定义里面引入了name和age
那么把name和age进行赋值
那另外一块我们可以看得到一个_str这样的一个函数
那么这个函数定义是我们让他返回
self.name加上冒号再加上我们的通过str转换的什么呀
self的age是这样子的
那么这个函数下划线名称下划线
这个执行我们之前print的时候
它可以自动调用这个函数
另外下面有一个_lt_
这个函数呢 是它的含义是lt
也就是小于号的这样的意思
我们进来的other这个参数以后呢
它返回一个什么样的值呢
那么返回的时候呢
是通过这样一个迭代的条件的表达式来去返回的
如果我们的名称name姓名不相等的时候呢
他就小的返回
否则的话他就按照什么呀
年龄小的进行返回
那么这是我们在这个类people里面定义了三个我们的魔法函数
一个是init
一个是str
和我们的lt这样的三个魔法函数
那么他这个魔法函数什么时候调用呢
init的函数我们知道是在实例化的时候
类的实例化的时候他就初始化的时候它就调用啊
那么下面这个呢
str呢是他是在print输出对象的时候
就他就可以调用这个
那个lt呢这个是在排序的时候
它可以自动触发掉
也就是我们在一些特定的操作的时候
他就可以触发这个魔法函数的内部的调用
那么在这个调用里面的我们可以看的到啊
通过我们这个把我们的主函数呢
调用触发它来调用我们这个调用我们上面这个什么呀
代码
打印的时候呢
我们可以看的到这个print的时候呢
他就我们这里面就可以自动执行str这个魔法函数
那么连接
那么连接了以后呢
我们可以看的到这个也是一个什么呀
一个for循环的
把每一个item取出来啊
那么首先第一个是什么呀
排序
那么排序有一个序排好序以后
item们取出来取出来然后转换成一个字符串
通过join进行什么呀连接
那么连接的时候空tab几个空格键几个空格
然后呢把他输出是这样的一个过程
所以呢我们进来了以后这个people呢
首先比对根据我们这个sort呢他就激活了什么呀
这个执行这个触发这个lt这个函数
那么就对people里面
如果name相不等的话
name小的会放到前面
所以a,b,c放在前面
a,b,c名称相等时候他把年龄要放到前面
年龄小的放到前面啊
那么这是这样的一个比较复杂的这样一个过程
我们通过一个函数就把它串接执行
是这样的一个过程
那我们在jupyter里面看一下执行的结果
再给大家引进几个其他的魔法函数
看一下他们的执行情况
我们看我们刚才这段代码
我们通过主函数的
然后调用它呢
可以看到它实际的运行结果会是什么样子的啊
我们来看这个地方会报了一个错误
那我们前面应该先执行我们这个函数
然后再执行我们这个
运行的调用主函数来调用它
我们可以看到这个执行的结果呢
就是
按照我们前面的函数的写的那个思路
给我们做了一个什么排序
那下面这个呢
我们可以看到他不仅用了什么呀
这样子的一个构造函数
初始化的构造函数
还用了一个_del_
这也是我们的一个什么
叫称之为什么呀
析构函数
那么这个_del_是我们可以喊他是在删除当前这个类的时候
或者类的对象的时候呢
他就触发这个del个函数
我们看这是定义了我们这个foo里面的init
还有个del这个
那么在下面的时候我们第一步
把我们类的实例化这个对象赋给一个foo这个变量
那么通过foo那么可以显式的也可以显式的去调用它
那么显式的调用它和我们隐式的调用只是显示结果
那么print的我们输出这个我们这个类的地址
我们输出打印他的时候
那么他是一个对象
就是一个地址
那么在把这个我们啥
这个我们实例化成对象把他删除
那么删除以后再输出它的时候
我们看他的结果会是什么样子的
我们运行以后可以看第一步呢
我们是哦实例化这个
所以他要执行我们这个什么样
自动会执行我们的init的方法
所以他会输出什么呀
第一句
那么第二个呢
我们是显式的调用它
del这个方法那么要用del的方法
我们的输出呢
是他啊
第三个的时候我们要打印我们这个什么呀
我们实例化的这个对象
那他得到的一个
是一个地对象的一个地址
那么最后呢
在下面一步呢
我们是要删除这个实例化这个对象
删除后我们可以看它会自动执行这个方法
于是他会出现什么
删除这个foo下面这个del这个字符串的输出
那么最后一步再要输出打印这个foo的话
他会报错
因为我们这个实例化的这个对象已经被他删除掉
所以他就会报错啊
那这个就是我们析构函数和del也是我们这里面的
一种魔法函数的一个使用
那我们在Python里面呢
会有许多这样子的魔法函数
那么刚才用了的init
看到的有这个str
还有这个lt
除了这些呢
还有一些
比如说我们要删除一个对象的析构函数del
刚才有个例子也看到了
还有new
new我们是实例化一个对象的时候
他跟init是很相似的
激活的时候都是通过我们什么呀
我们实例化一个类
实例化一个对象这样子来去激活使用他
那他必须new是要有个返回return的
还有一些比如说add
还有一些异常的用的这些魔法函数
那我们在自己的后面的编程中可以试着去用一些
那么除了在Python中的
我们用的这个环境jupyter下面呢
他也有他自己的一些魔法函数
比如说我们给列了几个
大家可以看一下这样百分号
两个百号还写着writefile就是调用外部的Python的脚本
我们是.py的文件
我们可以啊
我们在jupyter下面是不可以执行的
那我们可以怎么样
通过writefile后面这样可以执行
或者用百分号
一个百分号run也可以是他这效果是一样的
那我们也可以测一些一段脚本的啊
他的一些时间
那么一段脚本的或者一个单元中的代码是两百分号timeit
那么单行语句的调用的是那是一个百分号timeit
还有这个我们可以看得到这个matplotlib
是一个是一个是一个库
是一个画图的库
我们这个里面加样子matplotlib inline呢
就是可以把matplotlib生成的图像在我们这个jupyter这个页面里面
就可以直接的展示啊
writefile写文件
用百分号pdb是调试程序
还有百分号pwb是我们查看当前的目录
百分号ls呢就是我们list去看当前的这个目录啊
是这样子的
像我们像这个这段代码
就是我们把这个mat
这是倒包import是倒matplotlib下面的pyplot
把她给了一个像别名一样plt
然后呢我们这里面X几个是什么呀
我们一个列表y这个列表
那我们通过他呢
就可以把这两个列表的值是对应
pyplot是一个折线图啊
那我们都可以画成他的一个折线图
如果不写这个啊 我们的那个matplotlibinline的话
那他第一步执行的时候
他是只说我们生成了一个这样的一个2d的这样的一个图像对象
那么给了一个在什么什么的地址下
我们第二次在执行的时候
他才能出现这个图像
如果用这个matplotlib
这个这个inline这一句的
这一句我们的魔法命令的话
这个魔法函数的话
那么他就直接可以把所在的地址和这个
我们的这个图一起就展示出来
那我们下面看一下在jupyter下面它的使用
我们在jupyter下看我们刚才这段代码这个执行
那么这个是没有用魔法函数
我们执行第一次
可以看他出现这样子的
我们只有再执行一次啊
他才出我们这个图
如果我们这个是写了他这个魔法函数matplotlibinline的话
我们只要执行啊
你给他的地址和他的图片都会展示出来
这是他的区别
那么刚才我们说看一下这个目录结构
通过list百分号运行一下
我们可以看的到啊
我们当前这个目录啊
所在的地址我们也可以看到这个简单的就看一下目录
就可以看到当前这个路径
就可以从这个地方看到
这是我们简单的几个jupyter的魔法函数
那还有很多呢
在我们的学习中
大家可以试试去使用
那关于魔法函数的这一节的内容呢
我们就给大家介绍到这
-章测试
-章测试
-第一章:python简介
--章测试
-第二章:编码规范
--2.2常量和变量
--章测试
-第三章:数据类型
--章测试
-第四章:基本运算
--4.2比较运算符
--4.3逻辑运算符
--4.4位运算符
--章测试
-第五章:程序控制结构
--5.1顺序结构
--5.2条件结构
--5.3循环结构
--5.4跳转结构
--5.5异常处理
--章测试
-第六章:函数、模块与面向对象
--6.2面向对象
--6.4模块与包
--章测试
-第七章:文件操作
--7.2文件的写入
--章测试
-第八章:python生态库
--章测试
-第九章:TensorFlow基础
--章测试
-第十章:实例分析与实践
--章测试
-第十一章:人工智能在自然语言中的应用
--章测试