00:00
好,刚刚呢,我们说了一下垃圾回收,同时呢,讲了一个新的特殊方法,我们叫一个delete啊,Delete是在我们这个这个对象被删除的时候之前调用的,对吧,删除之前调用的,那接下来我们再来单独的说一下其他的特殊方法啊,来一个哎15我们专门来说一下特殊方法。叫一个PY,那我们先说特殊方法,特殊服是吧,特殊方法哎也什么呢?哎称为叫做魔术方法,哎魔术方法或者也可以叫做魔法方法都行,总之你看这个名字很特殊是吧?哎很特殊,那这里边我们来说一下特殊方法,哎都是通过什么呢?哎都是使用我们这个双下划线干嘛呀?哎开头和结尾的啊开头和结尾的,所以你看到这个方法用的是双下划线开头双下划线结尾,那这个时候它十有八九是一个什么呀?是一个特殊方法啊特殊方法,那特殊方法是干嘛的?那我们会发现我们之前讲了need,之前讲了比这些实际上是不是都是特殊方法呀?那特殊方方法我们需不需要手动调用啊?哎,不需要,特殊方法一般什么呢?
01:12
哎,不需要我们什么呀,哎手动调用啊,一般不需要我们手动需要什么呢?哎需要在我们一些什么呀,诶一些特殊情况下。特殊情况下干嘛呢?它会自动执行,也就说不用你手动调,它会在一些诶特特定的情况下,特殊的情况下自动执行,比如说ne是在对象初始化以后执行,比delete是在对象删除之前执行,那再比如还有什么呢?我们可以看一下啊,直接来看一下,那我们直接来看在哪的特征化,在我们的language reference啊这个文档里,Language reference在它这里边有一个栏,叫做data model,我们的数据模型,数据模型里边有一个叫做special method names,叫做特殊方法的一个名字,在这里它会把所有特殊方法给我们列出来啊,我们列出来,我们可以点进来看一下,比如说我们之前用过的什么呀。
02:04
In初始化对吧,比如说我们用了什么呀,Delete删除对吧?哎,你会发现还有一个什么呢?还有一个叫做一个什么呀,New啊,还有一个new,你会发现这三个话实际上是一套的,哎,New新的音译的初始化的第义的是什么呀?是删除的,那这什么意思呀,New是在我们对象创建时调用,也就是说我们创建对象实际上是通过new这个模式方化去创建的,我们特殊化去创建的,我们只不过没有用它,一般也不会用它啊,那你要知道new是用来创建对象的,然后这有一个叫什么呢?有一个叫做in it in是干嘛的,是用来初始化对象的,它是在对象创建完成以后执行的,还有一个叫做比delete删除是什么呢?是对象删除前调用的,所以每一个特殊方法是不是都有不同的时机啊?那这里E的比例呢?我们说过了,New我们说过你可以自己测试一下,但是你会发现new就不一样了,New的第一个参数叫什么?哎,叫CLS,那这个时候一定要注意这个参数,你写的时候你要看一下它是什么,那这个new我们就先不演示了,你知道有待会自己测一下啊,自己测一下,然后往下看,它这边是不是会有很多呀,哎,很多像什么呀,什么这个re PR啊,什么str啊,是吧,BI啊,什么LDEEQ,是不是有一堆啊,还有一堆这种特殊方法,那这里我们来演示一下这些特殊方法,我们先来看上边两个常用一点的,一个是re PR,还有一个是str,这两个是干嘛的,我们来看一下。
03:32
那在这里我们先尝试来定一个类,定义一个这个person类。Person类啊,直接来一个这个class,我们这来一个这个。啊,然后这个呢,是我们的一个这个。Person,我这写一什么呢?写一个这是我们的一个,哎,人这么一个类啊,人这么一个类,那这人这个类里边呢,我们来看下参数吧,先来一个这个name,呃,然后来一个什么呢?Age,再来一个这个什么呢?来一个这个咱们简单点吧,就来一个name,来一个age啊来一个name来那这个搜索,咱们这掉不掉都无所谓,因为我这也没有去没有去整这个。
04:14
负类对吧,负类就是我们这个object,这写B都行,我就给它省略了啊,这我直接s.name等于一个name。然后呢,再往下写,我来一个SF.h等于一个什么呢?等于H就这两个值啊,就两个值,然后现在啊,我们类定义完了,在这我们来干嘛呢?哎,我们来。创建。两个我们这个person类的实例,哎,创建两个person类的实例,我们这来一个P等于一个这个person啊person我们来一个这个孙悟空,孙悟空,然后这来一个什么呢?来一个18,然后这复制一下,我们来一个P2 p2我们来什么呢?来一个这个猪八戒。
05:03
猪八戒猪八戒我们来一个28,就这么两个简单一点的,好,那这整完了,那接下来我们来看什么呢?我这来啊,我来打印P,哎打印P直接来一个print,我们这来一个P,一直接一保存,我们来看效果啊,这一执行呃。报错了,Person is not DeFined person啊,这应该是什么呀?哎,大P啊,大批。保存一下,我们这再一执行,这回大家看它是不是打印的是这么一个玩意儿啊,哎,这么一个东西啊,这么一个东西,那你就会发现,其实这里面就会有点奇怪了,奇怪在哪?我打印对象怎么打印这么一鬼玩意儿,那首先这个我认识,这是内存地址是吧?这个我认识这是类的名,这object表它是一个对象对吧?这都是认识是什么?但是它为什么打印这么一个玩意儿,你看当我们去,假如我这定义一个元组啊,我来一个T,等于一个这个一逗号二逗号三,这是一个元组,我这直接print t,它这个时候是不是给我打印的是一个元组里边的内容啊,而我在这儿这个P去打印的时候,它打印的是什么?打印的是我们的这个,诶,这么一个鬼玩意儿,那这个是为什么啊,这个是为什么,我们这先给它住掉,我们这来说一下,那这是什么情况来。
06:18
到。当我们什么呢?哎,打印一个对象时啊,当我们打印一个对象时,它实际上是什么呢?实际上打印的,哎是我们对象的什么呢?哎是我们对象的中的这个魔术,哎特殊方法,特殊方法叫什么呢?哎,叫做一个下划线,下划线str叫什么呢?哎的返回值,返回值,所以注意啊,当我们去调用print去打印对象的时候,它这里边实际上打印的是什么呢?是这个str这个特殊方法的返回值,这个特征啊,刚才我们已经看到了,是不是在在这呢?哎在这儿呢,那这个实际上是打印它的返回值,也就是说这个方法返回什么,它就会打印什么,那我们来看看行不行啊,行不行,直接来写一个啊,直接来写一个,直接定义一个,我们这来一个下划线,下划线str下划线,然后这里边来一个这个。
07:19
我们这简单点,那既然返回式直接返回一个,返回一个这个hello person hello person,那现在注意了,现在我str的返回值是hello person,那根据我刚才的推断,那是不是就应该给我打印hello person呀,哎,我们来看看是不是我们再来一个啊print到我们这来一个这个P1直接保存我这一执行是不是hello po呀,来看这我这里边我再打一个P2,我们来看走一个这一保存走一个是不是也是hello po呀,那也就是说这个时候你这改完了以后,你调哪个对象去打印的时候,是不是打印的都是它呀,那我这换一个,换一个AA,那这时候打印什么,我这一执行是不是打印的A呀,哎,就是说ST的返回值是什么,它就会什么呀,它就会打印什么啊,打印什么就这么一个事啊,就这么一个事儿,那接着我们再来看啊,接着我们再来看,那还有什么呀,那这里边你要注意了,现在我打印是它打印这玩意儿有没有意义啊,哎,没有意义,那我希望当你打印对象的时候,你可以向。
08:19
组一样把对象里的信息给我打印出来,那怎么办?哎,那非常简单,比如说我可以这么写,我直接来一个这个什么呀,Pro pro在后边我跟着一个中号,中号里边干嘛呢?我写它的name是什么什么什么的,然后什么呢?Age是什么什么,我是把这些值给写上了,哎,我直接写一个name是百分之S,然后这来一个逗号H也是来一个什么呢?1%个这个,哎百分之百分之D啊百分之D,我们内部是一个数字对吧,数字然后在这我直接填,填什么呢?S点一个name,然后诶括号啊。Per self.name这来一个这个self点一个H,就是我把age和name作为变量,是不是填充进去啊,这样的效果就是什么呢?当我去打印孙悟空这个对象的时候,他会给我打印pro name是孙悟空,Age是18,然后打印猪八戒的时候,Name是猪八戒,然后age是18,我们这一保存一执行走一个是不是这么一个效果,哎,这么一个效果就出来了啊,所以这里边我们就已经,哎就出来它了啊,就出来了,这个就是我们说的一个什么呀,哎,这个str这个。
09:24
特殊方法啊,特殊方法,所以我们之前也说过了,研究特殊方法,你要研究两个东西,一个是这个特殊方法什么时候掉,第二个它有什么用,那首先str这个特殊方法什么时候掉。哎,这个特殊啊啊,我们来说一下。Str这个特殊方法。这个特殊方法会在什么呢?哎,尝试将我们这个对象转换为字符串的时候调用,哎,就说实际上你在打印这个对象的时候,实际上它会自动去干嘛呢?去这个对象调一个str这个这个类啊,这个这个函数,去将它转换成字符串,那将它转成字符串就会调用什么呀,Str这个特殊方法啊,特殊方法那它的作用什么呀?啊它的作用。
10:23
哎,可以用来干嘛呢?哎,用来指定我们这个对象转换为什么呀?哎,字符串的一个结果,也就是说你可以指定我这个对象在转换字符串的时候,到底是转换成什么样的字符串啊,转换成什么样的字符串,这个是我们说的一个它啊这是我们说它str,那和str类似的,还有一个什么呢?还有一个我们叫做re PR re PR,我们这来看一下。嗯,我们直接来写一个来DEF,我们叫做一个叫做一个re p啊re PR里边同样也是一个,这个self啊,也是一,那这里边我们简单点写,我直接返回一个hello,那这个时候什么时候调这个东西跟这个字符串很相似啊,很相似,我们在这一执行,哎,现在没有变化对吧?IPR这现在是不是没有体现出来呀?那rpr什么时候掉IPR我们说了,咱们来看一下,实际上我打印P1这个对象的时候,它就干嘛呢?实际上是拿SSPR这个函数对P1包了一下,也就说把P1这个对象转换成了字符串,你会发现效果是不是一样,我写scir跟不写是一样的,为什么?因为你在打印的时候,它会自动把这个P1转换成字符串啊,转成字符串,那我这iepir是干嘛的呢?看这我这现在改了,我不写SR了,我写什么呢?我写re撇R啊撇R,我换一个,我们这一直行走一个,这个时候是不是出现hello了,为什么?因为在这我说。
11:49
就是返回的是hello啊哎,返回哈,那这个函数什么时候调用。我们一般手动调的情况其实也不多啊,Re PR它是干嘛呢?
12:00
这个特殊方法对待什么呢?哎,我们这个对我们这个对象,对我们这个当前对象使用我们这个re PR函数时,函数时调用啊,函数调用它的作用是干嘛的,它的作用就是指定那个返回结果啊,走指定返回结果,那问题就是re PR这个函数是干嘛的,我们直接说啊,它的作用。是什么呢?哎,是指定我们这个对象在我们这什么呢?哎,在我们这个叫做一个交互模式中,哎,直接输出的一个效果啊,它是用来指定我们这个对象在交互模式中直接输出的效果,我们先来看一下,我不拿它烛演示,我们直接来用我们之前熟悉的一个啊,打开我们的I豆,I豆这里边我们来说一下,我直接来写一个A等于hello,那这个时候我A是一个字符串,Hello对吧?A等于hello,那这个时候你看啊,我直接写一个print a直接是不是给我打印hello啊,如果我直接切为它是不是也会给我打印啊,你会发现打印的是什么,是不是hello加引号啊,诶hello加引号,那为什么这两个有区别,那注意啊,当我们去调用print的时候,它调的是谁?调的是str这个魔法函数啊,这个特殊函数调的str,而当我们直接写A的时候,它调的是rpr,这个函数调的是不同的函数,所以在这儿也是一样,我们在这儿通过SR指定的是什么?
13:32
啊,指定的是它通过print打印的结果啊,Print打印的结果是什么?而我们这IEP是干嘛的,是指定你直接在交互模式当中使用的一个结果,哎,这两个有不同的一个用途,是在不同的这个场合,ISS加是打print的函数啊是print的函数,我们就直接写一下它是一个什么呀?哎,函数print函数,而我们这个IPR是什么?是你直接在交互模式当中输出的是候一个结果啊输出一个结果,待会自己来测试一下啊,自己来测试一下,好接下来往下来说,那除了这两个特征的话,这两个特征的话,其实还比较用的比较多,还比较多,再往下来看啊,再往下来看,那有一些情况下来看,我们现在我有两个对象,我想干嘛呢?哎,我想比较一下两个对象大小,我想比较什么呢?P1跟P2谁这我想看看P1大于P2,我们这一保存那行不行啊,那我直接去执行走一个干嘛了,报错了告诉你大于号不支持什么不。
14:33
支持person和person之间进行比较,也就是说我们person这个类型,它不支持这个大于号这个运算符啊,不支持大于号这个运算符,那这是为什么呀?哎,这是为什么?同样我们这种大于小于等于这种比较也需要运算符来干嘛呢?也需要运算符来支持,如果没有运算符,你是不能做这些比较的啊,不能做这些比较的,那这里我们来看一下,那我怎么让它支持大于小于这些比较呢?在这里我们还是有这个什么呀?哎,特殊方法这个关掉,还是看我们文档往下找,往下找,在这你会发现是不是列出一堆了呀,哎,列出一堆了啊,我直接给它粘过来啊,这个粘过来CTRLC。
15:13
哎,你发现都是双下划线开头,双下划线结尾的这些方法啊,这这些都是特殊方法,那意思其实也很明显了,哎,我们来写一下LT,这是什么呢?这个是我们这个小于。小于,然后这个Le呢,是小于等于啊,小于等于,EQ呢是我们这个等于AE呢是不等于啊,Not EQ啊不等于,然后呢,我们这个GT是大于,GE呢,是大于等于,它们都有特殊的作用啊,特殊作用那我们来演示一下,我们拿一个大于来演示啊,拿一个大于来演示,来一个GP啊,那我们如果希望像我们这个对象支持大于号比较,那怎么办呢?我们这儿来写一个直接需要给它定义一个特殊方法,特殊方法我们叫什么呢?叫做一个这个哎,GT大于嘛,Great then啊GT,那这个时候注意了,这个方法比较特殊,它除了需要第一个参数self以外,还需要一个什么呢?还需要一个啊,还需要一个other,那这块我们来先不管这other是什么,我们先不管other是什么,我们先写上,那现在我们来说这个方法有什么用?
16:26
这题它会在我们这个对象做这个什么呢?哎,做大于比较的时候调用啊,做大于比较的时候调用,那么什么呢?哎,该方法的返回值将会作为什么呢?哎,作为我们这个比较的一个结果,所以注意了,这个方法是需要有返回值的,比如说在这我简单写一个,我直接来一个return,一个什么呢?一个出。Red。Return一个处,直接返回处,但这个时候我们先来看能不能比啊,能不能比,我这一直想走一个是不是能比了,哎,能比了,但是我如果写死了返回处会产生什么问题呢?看着我来一个P1大于P2,我再来一个P2大于P1,两个咱们来看走一个是不是都是错,哎,都是处,所以如果这么写的话,他们是不是有问题了,哎,有问题了,所以这个时候P1大于P2 p2大于P都反映出结果不对,所以你不能这么写,那怎么写呀?哎,那怎么写呢?那这里边注意了,我们这里边说了,它有两个参数,它需要两个参数,一个什么呢?一个是self self表示什么呢?表示我们当前对象啊,当前对象还有一个什么呢?还有一个是other other表示什么呢?Other表示和什么呀?和当前对象比较的对象啊,比较对象,那简单来说self是谁?Self大于R。
17:53
Self是谁?Selff是符号右边对象,而other是符号什么呀,左边对象,所以当我去P1大于P2的时候,Self是P1,而other是P2,当我是P2大于P1的时候,Self是P2,而other是P1,懂这意思吧?诶,一个是左边对象,一个是右边对象,所以在这你可以干嘛呢?我可以这么比,我直接来一个self点一个H大于other点一个H,也就说我在这时候比较他们的两个年龄啊,哎,年龄大,如果年龄大就返回出,如果年龄小是不是返回false呀?所以现在来看,当我们去P1和P2去比的时候,P的年龄是18 p2年龄是28,那这个时候是不是应该就是false呀?反过来是不是应该就是处啊,这时我们任意执行走一个是不是false true哎,就出来了啊,所以注意通过我们的这个GT就可以指定我们这个两个对象在做大于比较的时候,一个什么呀,哎,规则它是怎么去比的,通过GT来指定啊,通过GT来指定,那这里边注意,那通过它我们是不是就可以指定一。
18:53
些复杂的规则了,哎,就可以指定一些复杂的规则了啊,那包括什么呀?LD是小于的时候,哎,L是小于等于的时候,EQ是什么呀?是我们这个等于的时候,把符号写上啊小于这是什么呢?小于等于这个是等等,这个是,哎,不等,这是什么呢?这是我们这个大于等于啊,这个是什么呀?哎,这是大于是吧,下边这是我们这个大于等于啊,大于等于。
19:19
那特殊说法呢,还有很多,哎,像我们之前说过的是吧,我们说过什么呀,我们来搜一下吧,直接搜一下说过什么呀,说过这种嫩是不是来获取长度的呀?哎,获取长度的还有什么呢?哎,咱们来把这写什么,哎,我们叫做一个嫩。在这单独来写一下,我们叫做一个棱,棱是干嘛的呢?是来哎获取我们这个长度的啊,获取我们这个对象的一个长度,那还有什么呢?还有我们的这个,比如说我这来一个,这有一个叫做一个不。这个我们需要演示一下井号一个不这个什么呢?哎,布尔对吧,但就说这个是干嘛的,我们都知道我们的对象是不是可以转换成布尔值啊,哎,对象可以转成布尔值,我们之前说了,这种非空的对象一般是不是都转换成处啊,只要你对象不是空的,你就都会转换成一个处,那它到底是根据什么规则去转呢?实际上就是由这个函数来指定的,那现在来看啊,我们现在来先看这个。
20:21
直接来写啊,直接来写,我这直接来一个print,我们来干嘛呢?哎,我来一个这个BL,一个什么呢?一个P1,我来干嘛?尝试将P1转换成布尔值,我这一执行是是一个什么是一个处,为什么处,因为这个对象不为空,所以它就是什么处,那假如说我想改变这个结果怎么办?那我就需要加一个方法,某种法叫什么呢?直接定义一个,我们直接来一个这个下划线,一个这个bol里边一个参数来一个这个self啊,两个下划线啊,双下划线,然后在这看着我直接re t return一个false,直接返回一个force,这个时候我们来看效果,我这一执行走一个,这是什么就是false了,我这来一个,我返回一个这个处一保存走一个,这是不是就一个处,诶,你会发现我们这个对象它被转换成什么布尔值是由我们这个bol这个特殊方法来决定的,啊,都是方来决定的,那这时候我可以干嘛呀,我可以这么写,直接一个这个。
21:21
S点一个H大于17,哎,我来看看我返回你的年龄是不是大于17,如果你大于17,我就返回处,否则就返回负,这时候我们来看孙悟空大于17对吧,我这一直行是不是true啊,哎,True,然后我这换一个把孙悟空变成八岁,这一直行是变成fourth呀,哎,所以在这注意我们可以通过它来指定我们这个什么呀,对象的转换规则,哎,我们可以什么呢?可以通过我们这个Bo,哎,我简写了啊来干嘛呢?哎,来指定我们这个对象转换为我们这个,哎不尔值的一个情况,什么时候转换成处,什么时候转换成false啊都可以通过它来指定,那好,那接着我们再来,它有什么用啊?哎,其实很用处很大是吧,比如说我们可以这样写,那有了它以后,我们假如说我想判断一个人他是不是成年,我可以直接怎么办,我直接来一个if if p if p,我直接print print一个什么呢?哎,Print一个P点一个name逗号,我来一个什么呢?哎,已经成年了啊,已经成年了。
22:21
那注意了,我们在if后边这个条件可以直接可以跟任意值啊,因为我们说了任意值是不是都可以转换成布尔值,所以你跟什么都行,它会自动转,那像P1什么时候出啊,我们说了是不是它大于18的时候就是出啊,哎,我们这一执行走一个是不是孙悟空已经成年了,哎,孙悟空成年了,往下我可以接着写,直接来什么呢?哎,Else else,我来什么呢?Peter name干嘛呢?哎,还未成年。还哎未成年这时候一保存,他是不是肯定不出来呀,肯定不出来,那我直接干嘛呢?把这年龄改了,我这改成一个这个八岁改成八岁,这一保存我们来看效果,这一执行是不是还未成年,哎还未成年,那这样我们的代码是不是就简单很多了,哎简单很多了,直接通过布尔值来转化,当然这种形式呢,也不推荐写,不推你这么写,因为这个不清晰,你这条件是啥呀,什么时候处,什么时候for,如果你很熟悉还行,但是如果你不熟悉这块其实不清晰,哎,所以你知道可以这么写,但是并不推荐你这么写啊,不推荐你这么写,好这是一个bol这个函数啊,那我们就说了,获取对象的长度啊,可以指定对象的长度,然后再往下还有什么呢?哎,那有些情况下,我们是不是想对对象做加法减法这些东西啊,哎,我们有一个叫做什么呀,叫做一个I的这些东西,我们找一下下划线下划线A的。
23:44
找一下,哎,在这那这些都是我们对象的这些什么呀,哎,这些运算的这些特殊方法,我给它粘过来啊,还是我不再去一个个说它。呃,我想把它粘哪,往这儿粘吧。
24:00
站过来。哎,你像我们这什么呀,这个艾的就是加法sub,减法Mar什么呀,是这个这个乘法是吧,等等等等,一系列的floor div是我们这什么呀,地板除对吧?哎,By pro是我们这个这个幂运算对吧,等等等等,会有一系列的按的是什么呀?是我们这个与运算,O是我们这什么呀?哎,是我们这个货运算等等等等吧,我们会有一系列的这些特殊法特化非常非常的非常非常多,那你需要实现什么功能,比如说你想需要你的对象支持加码,你就实现一个什么呀,艾的,你需要对象可以执行小于,你就执行一个什么呀,LT你需要对象可以获取长度,你就执行一个什么呀LN你需要哪个你就去执行哪个,那在这里我也就不一个一个的演示了,因为太多太多了,你要知道它的作用就是在一个特殊的时间,它会被调用,调用完成一些特殊的功能,它其实主要就是配合我们这个多态的多态,比如说我们加法既可以执行字符串,既可以对字符串进行。
25:09
大法也可以对数字进行加法,为什么?就是因为字符串和数字都实现了什么呀,爱的我们的小于,既可以对字符串进行比较,又可以对数字进行比较,这是为什么?就是因为字符串和数字都实行了什么呀,都实现了这个let这个方法,只要这个方法就可以去比较,那这也是对我们多态的一个很好的一个什么呀,很好的一个呀体现,那我在这里就不一个个说了,具体的方法我们在用到的时候,我们在具体的细节去去讲,用到的时候我们再说,现在还是先知道一下就OK了,好,这里我们来停一下。
我来说两句