00:00
同学们大家好,那么第一小节开始,我们继续给大家讲解魔术方法,好了,上一小节我们给大家讲两个魔术方法,是Co号和learn,对不对?那我们接下来给大家讲啊,来,我们在里边给大家再继续讲两个常两三个常用模术法啊,下线下划线str啊,这是我们这一次的模术方法。好了,这个模术法到底是干嘛用的呢?大家会想,哎,这个东西是不是跟字符串有关啊,为什么写的是个str呢?没错啊,它确实是跟字符串有关,具体干嘛用的别着急,我们准备来写一下。好,把这些数据先删掉啊,把这些数据先给大家删掉。然后我们写一个跟我们的str相关的一个类,然后进行一下操作。好了,在这里边我们新建一个文件,用来记录我们的类啊,右键新建一个文件啊,我们写上一个模的啊,讲模式方法下划线啊,我们的str,然后点击OK,然后我们在这里边创建一个类啊,创建一个类,什么类都可以啊创。
01:00
借一个类。创建一个类,什么类呢?咱写一个人类吧,行不行,那在这里边class human啊,很多时候为什么老写人类啊,因为我熟呗,好了,人类加一些成员属性,一些成员方法。和一些乘员方法啊,乘元方法好,那么随便加吧,比如说我们加一个颜色,肤色,我们写上一个黄色啊。然后呢,再加一个性别吧,性别给一个女。然后你这个age啊,年龄给一个18岁是不是,然后name咱也给一个name,咱就叫他这个史真香行不行。好,叫史真香,这使呢啊。真香。真的是真?珍重的珍啊,香是这个香好,然后呢,再加一个成员方法啊,随便加几个就可以了,来DEF我们加上一个吃饭的方法,套上括号print,真香啊是不是?
02:03
真香好,写错了,真香好,然后呢,再加一个吧,怎么行,再加一个DF,然后呢,Smell啊,加一个笑的方法。套上括号,我们写上。哇啊啊啊啊,好搞定,然后呢,这个时候我们干什么事呢?实例化对象,实例化对象,实例化对象好对大家说没什么难度嘛,对不对,比如说GS啊GX等于我们的human human方括号,这样一来的话,我们就得到了个对象,我们干什么事呢?我们现在打印对象行不行,打印对象print套上括号打印什么呢?我们的对象本身啊,SZX对不对,右键运行程序肯定可以打印出信息,打印出来的信息写的什么呢?哦,写的是人类的一个对象在内存的某个位置,那这个时候大家会想到这个东西跟我有啥用啊,其实给大家一般情况下大家对这个信息是没有用的,于是乎我们会想另外一个问题,什么问题呢?你看我打印一个其他类型的,我打印什么呀,写错了,我打给大家写注释,这个是吧,我打印列表,我打印一个列表。
03:19
他给我的是真正的列表内容,对不对,我打印字符串,他给我的是给我啊的是字符串的内容,但是大家都知道啊,大家都知道一个问题,什么呀,你列表你打印的那个列表,它其实本身也是列表类的一个对象吧,是不是它就是我们list类的对象。然后我们打印字符串,这个字符串那不就是我们字符串类str类SR类的一个对象吗?为什么别人打印的会是里边的数据,而我打印的它里边就给我这么一句话,而产生什么用呢?好,这个时候呢,就涉及到里边魔术方法问题,什么方法呢?就是我们下面要讲的这个下划线,下划线str魔术方法。
04:13
这个方法可以控制对象打印的数据到底写是什么。当然很多新民会有奇疑问,说哎呀,我怎么直接打印就可以用啊?那是因为我们的对象里边,或者说我们的类里边,它本身就有STM,你看这个方法是自带的啊,不限扩,那个不写就不能用,你即使不写它也能用,但是如果我在这里边写了某法下线,下线str。下线下线str下线下线啊下线下线,那么当我写出这个魔术方法的时候啊,Pass一下,我其实是干什么事儿呢?重载了魔方啊,是实际上你在重载某式法。重载魔术方法小写小写啊,那大家会有疑问,这个魔方哪来的,我没加过呀,那里边没写啊,没错啊,因为人家是继承自object的啊,继承自object类的。
05:14
明白了吗?也就是说啊,任何的类里边其实都有这个方法,只不过是什么呀,这个方法呃,它有一个固定的通用格式,就是我们刚刚打印那一大串内存地址的信息,没什么用,对不对,现在我重载了,OK,再执行程序,你会发现他报错了,报什么错误呢?告诉你这个方法必须返回个字串类型,看到没有,而不能是一个那类型,所以它这个返回啊,有要求什么呢?你要求返回的必须是一个字串,至于你返回的里边是什么东西,我不在乎啊,我不在乎。必须是字符串。好,必须是字符串啊,然后右键运行的时候,程序的时候,你就会发现我打印对象的时候,你看也就是你这次在下面使用print打印对象的时候,出来的是这句话哦,这个意思就是原来我们对象打印的时候想显示出什么信息,无非就是重载一下这个不就可以了,没错,是这样的。
06:11
你想写是什么信息,就在这里边写就可以了,比如说我想写,是的是我不能告诉你我我的内容是不是,那这个时候下面收到就是这个信息了。看见没有,所以说通过这种实例大家其实就可以知道了,原来什么呀,人家列表类型字符串类里边已经专门针对S加机器人重载嘛,对不对?所以人打印的信息和我们正常自己定义的类打印的信息是不一样的,明白了吧?当然你也可以按这种方式来自己定义,比如说我打印对象的时候,我干什么事呢?我只告诉这个人的年龄,行,那你就返回,返回年龄不太合适,返回名字吧,那我们返回就是self点儿name。点name,那你这种情况下,你只要打印对象反馈都是对象名字,你看反回什么对象名字,嗯,所以用法由你来决定,这就是我们的str模术方法,所以它的触发实际我们可以知道是什么呀,使用print打印对象的时候啊,使用print打印对象的时候自动触发,然后它有什么用呢?可以定义打印对象显示的信息啊。
07:20
打印对象显示的信息内容,它有参数吗?有的,当然它只有一个参数啊,人家这里边的参数是一个固定自带的S,没有别的可以选择啊,所以一个S接收当前对象。返回值必须有,而且要类型还有限制,是不是必须有,且必须是字符串类型,好,当然可能说它有注意事项嘛,它有的,我们它的注意事项在什么呢?其实在于它的触发时机相关啊,我们的ST实际上有两种方式可以触发,除了你打印对象的时候触发,这个时候确实触发了来看。
08:03
很多人说这个看不出来呀,没关系,我们在这里边把原来那句话打印出来行不行?Print s tr方法备注发str方法被触发。好,右键运行找去。好,现在什么都没有,因为我们没有打印对象,对不对,所以现在给大家打开打印对象这个操作啊,来右键运行一遍。你看是不是STF被触发了,这是第一个触发时机,就是当你打印对象的时候会触发,但是实际上它还有第二个触发时机来触发我们下线,下线STSTR的第二个时机,什么时机呢?这个时机。实际上就是使用str这个类本身的时候,就是当一个这当把它当函数来用,比如说str套上框,我把刚刚的对象S时针C放进去,对不对,这个时候由于什么呀,Str参与了这个对象的操作,所以实际上它也会触发,看见没有,实际上它也会触发,所它触发实际有两个,一个是你打印的时候,另一个就是什么,这种操作我们叫什么呀,什么类型转换啊。
09:11
这个叫做类型转换啊,类型转换没错,所以需要注意啊,注意事项就是除了print之外啊,是之外写错了,使用print之外。使用我们的str,然后转换数据的时候也会触发,这就是它的注意事项,Str有问题,好,这个方法完了之后呢,我们再来看一个跟str非常相似的,另外一个某除方法啊,第七个叫下划线,下划线R1撇。Re PR魔术方法很多,学这个好像一样的时候,好像有这个函数啊存在啊,没错,确实是有这个函数存在的。当然我们为了学它的魔术法,依然把这五条复制过来,教大家来写一下这个魔术方法,新建一个文件,把这些信息都给删掉。
10:02
来删掉。删掉。这个删掉。然后呢,在这里边我们新建一个文件,好吧,右键新建一个pthon文件,名字叫做method下线RR。好,点击OK创建文件,这里边依然声明一个类啊。依然声明一个类,好,这个类class还叫human human,我们在一个类里边随便使用这些魔法,无所谓啊,成员属性和成员方法。好,然后呢,在这里边属性随便加,方法随便填啊,跟这些没什么大关系啊,还是一样的黄色的,然后呢,AGE18岁,然后呢,再加一个名字吧,名字我们叫它啊,叫做叫做菊花啊。好。然后呢,接着来啊,成员方法咱也加一些啊,DF加一个吃的方法吧。
11:03
好,Print框啊。好。真好吃,是不是你刚说什么真好吃呢,海鲜真好吃,然后呢,再加上一个喝的方法啊,D drink drink drink,套上框,我们写上啤酒真好喝。虽然我喝起来感觉跟那个啥玩意一样啊,那个味道确实不好喝,好了,Print套上括号啊,我们写上啤酒很好喝,啤酒很好喝,好就这样就可以了。我们也不需要写其他的,这个时候呢,老规矩使用化为对象啊。实例化对象,好,当我们实例化对象的时候呢,咱这个名字叫菊花GH啊,就等于我们的human。Hum好对象创建成功,创建成功对象之后呢,我们在里边干什么事呢?打印对象啊。打印对象本身,所以在里边啊,打印对象直接print printt套上括号GH,好右键运行,为什么问题的好,是不是打印对象信息了,和原来一样对不对。
12:10
我们接着来看啊,接着来看什么问题呢。下面在这里边我们加一个I tr的魔术方法啊。下线下线re PR,下线下线魔术方法来DF,我们写上下线下线名称固定啊,下线下线re PR PR,下线下线好,写上去之后呢,我们在里边依然输出一句话告诉你,Re PR方法被除法。被触发。好,右键运行程序,发现有什么问题看看啊,有没有问题呢?我们会发现R一方R1P方法真的被触发了,这就奇怪了,很多学说我我也没看见你有哪个什么特别的地方啊,是不是这里边无非就实际化对象和打击了对象本身呗,你说实例化对象能触发吗?不能,他的两个步骤是不是已经被人触发完了,所以右键预行变程序,大家看。
13:02
哎呀,这次没有了,这就意味着你的print,它确实也能触发re PR方法。他们说这也可以,是不是为什么呢?好,这个请注意啊,我们在这里边为什么触发了re PR方法呢?是因为在我们的什么呢?在我们的。这个类里边会有一句话啊,哪句话呢,叫所有类,不能叫所有,其实啊叫所有类啊,默认都有一个表达式。默认都存在一个。式啊,等式,这个等式是怎么写的呢?叫做下划线下划线啊,叫做STRSTR下划线下划线等于下划线下划线retr下划线下划线,我不知道大家能不能看懂这句话到底什么意思啊?你看这都有这句话了,你写和不写,其实这效果一样,看到没有,然后这个时候呢,我们打印对象的时候,你会发现和刚刚错一样,一该报错,报错该咋地咋地,是不是,是不是一样,是不是,原因是什么呢?很简单,这句话的意义代表什么呢?它表示将re PR的方法,将rpr的方法,然后呢,赋值给str。
14:26
方法也就是他俩是完全一样的,完全一样完全一样的,明白什么意思吗?简单的说啊,其实你定义了IPR之后,你同时也相当于定义了str,所以你打印的时候,它触发的是str。而不是R1撇。所以这句话千万要记姿啊,这就是为什么我们正常情况下打印一个对象,你看我们把上面这个代码注释掉啊,你正常情况下打印一个对象,右键运行程序啊,它这个时候它执行的是str,是str,但实际上因为这句话的存在,我们正常的对象里边str和re PR的信息是完全一样的。
15:09
然后呢,这个时候我们如果自己重新定义了IER。这个时候如果我们自己重新定义了re PR魔术方法,就相当于同时重新定义了S,于是它俩实际上是一体的,能理解吗?所以在这里边特别需要注意啊,叫做。在通常的类中啊。Re PR重载。从。载意味着就相当于什么呢?Str也被重载了,也被重载,原因就是因为有这句话吧,这个等式能,这个等式我看不懂啊,这不这个等式你看这什么,这不是个变量吗?这是函数名,函数名就是变量嘛,是不是把这个变量能复制这个变量,所以它两个其实上是一个东西啊,然后呢,这个时候大家说这玩意到底有什么用啊,好像没什么大用啊,实际上不是的啊,实际上并不是这样的。
16:08
很多很多学们搞不明白,说这到底有什么区别呢?来看好了,我带你看一下,Re PR到底有什么用?Re PR的应用它肯定不是什么呀,为了定义完了给F用的是不是?那我定义它干啥?正常情况下,给大家定义一个手册。看好了,我定义一个字符串,比如说MYMY送啊我的歌,等于叫我喜欢啊你。然后呢随便写,然后呢在里边我加一些转移字符行不行,然后呢反斜杠T好,我也不加多了,加多了没什么用啊,看好了,我现在正常。正常打印字符串啊,正常打印字符串,说你你说是在打印字符串,其实在打印字符串对象吧,是不是打印符串对象。字符串对象,万物交对象,然后呢,在这里边print套上括号MY。
17:06
然后呢,打印的效果是这样的,大家来看啊,把上面这个注释掉吧,因为上面会影响下面所有的,把上面这个注释调啊,一会再回来给大家看好吧。来注释掉我们上面的这个类的定义。把它拿过来,把它也拉下去。好来看好了,我们现在打印这个字符串的时候,嗯,就是字符串本身转移字符是不是也被转移了,是不是好来接着看啊,那我print套上括号,我用什么呢?Str再转一遍这个字符串呢?这就相当于什么呀,用str转换这个对象对不对?转换这个对象跟前面这个也没什么区别,因为它本身就是字符串类型嘛,所以两个是完全一样的,看见了吗?但是。当我使用。使用什么呢?Rpr转换函数啊,用这个函数转换并打印。
18:00
并且打印就不一样了。也就是说,我这次打印的时候应该这样打印啊,Re PR,套上括号,写上我们的MY。大家看第三个。看见了吗?第三个和前两个是不一样的。我说这怎么不一样呢?是不是?What明确跟写一样的。这里边之所以不一样,是因为字符串里边既存在一个S撇R,也存在一个R1撇,也就是说字符串里边这句话被去掉了,取而代之的是一个R撇,一个S撇。但是正常情况下我们是用不到的,所以呢,一般情况下一个类里边IPR和str是没什么区别的。而且这个不单在我们这个代码里边啊,你实际上在我们的其他的一些数据类型的操作中,也可以发现他们其实是完全一样的,来给大家看一下吧,行不行?首先呢,把这个类给大家打开注释啊,我们现在打印一个对象对不对,你会发现啊,我打印GH的时候触发了这个。
19:00
我的方法呢,我的方法怎么能没了触发了,我这个我的方法哪去了。不小心把方法弄没了,我退一下好吧。啊在这啊,我小心弄没了,把下面这个注释掉。然后注释掉,然后把上面这个注释打开。打开这个就是,然后呢,正常情况下我们打印对象的时候呢,它会执执行RSTR对不对,然后呢,Str由于和rpr正常情况下是一样的,所以它实际上是触发了rpr,那么这个时候运行会报错啊,报错的原因在于什么呢?嗯,数据类型不对啊,因为re PR它要求返回的必须是增态,所以re PR返回的数据啊,返回的数据,返回的数据。所以正常情况下,你用rpr和str检测任何数据类型,除了字符串这样之外,剩下都看不出来的。比如说啊,给大家做一个小例子。
20:01
该什么例子呢?咱这次来一个列表行不行?写一个my list啊,写一个my list。写错了啊,My list,它等于中括号里面。啊,12345随便写吧,然后打印的时候啊,你无论是什么呀,无论是用rpr来打印,还是用什么来打印,你比如说我这里边转换成字符串,用str来打印啊。再转换一下,用IPR来打印,用IPR转换再打印,你会发现它俩是没什么区别的。啊买送干嘛买list啊。来大家看一下啊,我把列表转换成用IPR转换和用IPR转换和有没有区别啊,反是没什么区别的,看到没有,没什么区别完是不是完全一样,原因很简单,因为列表里边R1P和S加是一个。但是字符串里边是两个,那我就是希望我的对象使用R1撇,R和S加转换产生不同的结果可以吗?答案是可以,这个时候你需要重新定义S。
21:06
重新定义str模式方法。当两个方法都是重新定义的时候,他们就互相不会干扰了,看好了,下线下线STRSTR,啊,下线下线跑成框。画框,然后在里边我们加一个return啊,这个咱已经学过了,对不对,它是str返回的数据。Str返回的数据,好了,大家看好了,我这里边既定义了str,也定义itr,当我使用打印的时候,它触发的时机应该触发的是ST,对不对?没错,看返回的就是str的数据,看见了吗?它不会返回rpr的,你想返回rpr的就得什么呀,使用IPR转换之后打印了。使用re PR转换之后进行打印。所以你如果想让re PR进行工作或者触发的话,就必须在里边使用re PR函数,触发了这个操作才可以返回IPR的数据,看见没有,第一个是str的,这个是IPR的,当然IPR中间这句话是因为我们里边已经写过了,是不是在这里这句话对不对?
22:18
好了,返回来再看一下,给大家总结一下啊,首先re PR的触发时机是固定的,只能是怎么在使用在。在使用我们re PR转换对象的时候。自动触发它有什么作用呢?可以设置re PR函数操作对象的结果。操作对象的结果,你是IPR操作对象,那就会触发IPR,使用str触发或print就会触发。Str,但很很可怕的就是对象里边的str和itr绝大多数情况是一样的啊,有没有参数呢?没有,就一个自带的SF啊,一个SF接收当前对象本身有没有返回值呢?有,必须是字符串,说白了这它跟我们的str非常的相似啊。注意事项是什么呢?正常情况啊,正常。
23:17
情况下啊,情况下我们类中的str下线下线str。下线下线啊ST下下线和下线下线re PR的魔术方法,魔术方法是完全一样的啊。完全一样的,也就意味着其实他们可以总结到一起有三个触发,对不对?Re PR能触发,Str也能触发,Print也能触发啊,当然也之所以是一样的,我给大家解释过了原因里边是不是有这句话复制操作呀,对不对,但是也有不一样的。字符串就绝对不一样,字符串中的str和I tr魔术方法就不一样,原因很简单嘛,因为人家两个是不是都新重重载了就不会有问题了,你如果只重载一个的话,特别是你只重载了R撇str一定会变,但是你反过来不是啊,你要是重载了是么?S撇I撇是不会变的。
24:18
好了,这就是我们str与RTR魔术方法,这两个方法是相生相,就是一种相生的关系啊,互相依赖的一个关系,所以这个东西稍微有点复杂。好,分享集就讲到这里,感谢大家收看,我们下一小节再见。
我来说两句