00:00
好,同学们大家好,那么这一小节开始,我为大家讲一些什么呢?Python当中常用的魔术方法,在里面新建一个文件啊,新建一个普通文本文件,来给大家记录一下魔术方法。好了,魔术方法到底是什么东西呢?哎,说到点上啊,魔术方法也是方法嘛,是不是魔术方法啊,什么东西呢?一种特殊的方法而已。它到底特殊在哪儿呢?它注意啊,它的特点在于不需要调用啊,不需要人工调用,它会在特定的时刻自动执行啊,这就是我们魔术方法的一个特征,魔术魔术是不是比较神奇啊,是不是,那这就是魔术方法里边的一个东西啊,当然魔术方法。非常的多啊,魔术方法非常多,所以我们会给大家逐个的讲解常用的魔术法,不常的回答列出来好吧,好,谁来看一下我们要学的第一个魔术方法啊,叫做下划线,下划线init。
01:07
下线下线init啊init注意啊,前面是两个下划线,后面两个下划线啊,这个方法我们一般叫它初始化某式方干嘛用的呢?哎,要学习魔术方法,我们会从四个方向来学习啊,这四个方向分别是第一它的作用是,呃,不是它的触发时机啊,触发时机因为毕竟比较奇怪嘛,是不是触发时机,什么时候开始运行呢?这是它的触发时机。第二个是什么呢?它的作用,它有什么用啊,然后第三个呢,它有什么参数啊,因为。方法呢,是不是模式方法也是方法呀,所以它有自己的参数啊,第四个它是是有没有返回值,或者具有什么样的返回值,然后呢,最后再加一个注意事项啊,注意事项我们每学一个方法都从都会从这五方面来学习,行不行?好了,先看第一个初始化,初始化模式方法的一个作用啊,首先呢,在这里边,哎,我们新建一个方法啊,新建一个文件夹吧,行不行,因为模式方法比较多,所以给大家新建个文件夹吧,新建一个文件夹啊呃,Mac吧,Magic啊,省的都放在外边比较乱啊,来创建一个文件夹,然后在这个文件夹中给大家创建一个文件啊,一个Python文件。
02:31
我们现在讲的第一个魔术啊,行不行,咱叫它这个,呃MM呃叫叫什么名好啊,叫I it吧,你们这叫I it吧,好点击OK,然后呢,这个魔术方法。初始化下线叫下线下线啊in。下线下线初始化啊,初始化模式方法什么时候用呢?哎,我们举一个小小的例子让大家来理解一下,比如说我们现在有一个什么呢?有一个人类啊T有一个人类,那么在人类里边肯定有很多属性和很多方法,对不对?好属性我们加一些什么呢?比如说性别呀,哎,开始写一个man啊,年龄啊,Age。
03:15
Age等于18是不是H等于一岁吧,然后呢,再加上什么name是不是等于张三?然后呢张三,然后呢,EY眼睛等于两个是不是,然后呢,再加上一些其他的一些信息,比如说肤色,肤色啊等于什么黄色。好,然后呢,加一些方法来DF,我们加一些加一些方法啊,比如说加一个示范的方法eat print,套上括号,在这里边输出示范方法,好,再加上一个跑步的方法DF,我们叫它run啊,套上括号,我们写上跑步的方法,Print套块写上跑步方法。大家注意啊,我们在学习语法的时候呢,会把这些方法写的非常简单,里边一般就用普通的输出代替啊,真正工作的时候,遇到现实的操作,里边会写其他的代码好了,然后再加一个吧吃喝,然后呢睡觉吧,S Le live方法,然后呢我们在里边输出啊睡觉方法。
04:18
睡觉觉方法好睡觉方法。好,接着来看,如果说我们现在要实例化一个人的对象啊,就是说白了就是造一个人呗,是不是实例化一个人啊的对象,那么正常情况下我们会怎么做呢?我们要做的肯定是啊,一个人等于human human套上框,这个时候我们就可以得到一个人类的对象,对不对呢?对。啊,完全没问题,是不是出来一个人的对象了,好很多说,那这个有什么问题吗?没有问题,按照我们之前学的,到现在一点问题都没有啊,但是现实中的生活,大家想想,如果说。
05:01
你用人类的类造出一个人的话,这个每个人和每个人是不是有不同的差异啊,对不对?很多说哪怕差异咱们不是学过吗?可以改,通过修改存到对象里边,但是那个时候就已经晚了,我们的性别是不是在生出的那一刻,就是造出来那一刻就已经决定好了,对不对,我们的名字是不是后来添加上去的对不对?然后呢,这些东西什么性别呀,年龄呀,身高呀,体重呀,还有他的姓名啊,是不是全部应该归这一个对象所有,而不能归人类所有。大家想想其实很正常啊,你看比如说名字这个东西,我们人类的能可以叫张三吗?不能,人类是没有名字的,而只有什么呀,确确实实生出来的这个人,也是这个对象才会具有名字是不是?所以名字它不应该出现在类里边啊,应该出现对象里边,但是我们刚刚做的这个对象啊,你会发现这个对象里边是没有名字的,来第答一遍,没有任何成员。
06:02
而我们希望这个名字就是归这个车所,包括性别也是对不对,那怎么做呢?之前我们是做不到的啊,因为大家之前写的都是在类里边直接写,咱也说了,只要这个属性是什么,是用类的,那么它没必要复制到对象里边去,而我们现在就是要把它放到对象里边,怎么办呢?好,这个数据按照初始化模式方法了,初始化模式方法它。到底有什么作用,我可以给大家说一下,它就是为对象添加对象,所有属成员啊,为对象。写错了,为为对象添加对象的所属成员,对象的所属成员,也就是说当你想给对象加成员的时候,就得通过这个方法啦,因为之前咱根本就不会加,只会通过修改的时候再增加,对不对?那现在我们把名字、性别这些东西啊,比如说眼睛什么的都属于人类,咱无所谓了,不用改了,咱要把什么呢?性别、年龄和名字这三个东西归这个人本身,对象本身所有,而不能归类,眼睛优雅呢?人类的特征是不是比如说肤色、黄色咱都可以归为人类,但是性名啊,性别啊,年龄啊,是不是应该归人类所有啊?怎么办呢?看好了魔术方法。
07:17
当然魔术方法也是方法,所以你可以直接放到这个位置啊,来魔术方法下线下线init小写啊it啊下线下线在里边直接写就可以了,EF下线下线itit方法名固定名称不需要你改,然后里边serve自动带的,然后我们在里边出写上一句话啊,Print干什么事呢?叫init方法被执行。就是这句话好了,然后大家再看我们下面这个代码啊,下面我们在这里边只做了两步操作,第一步操作,这叫做实例化一个人类对象嘛。一个对象啊,实际化一个对象。第二步是打印对象成员,是不是打印啊,对象成员就这么两步操作,然后没有任何的调用函数啊,但是大家看好了,我运行程序你会发现。
08:09
运行程序走你,诶ii号码被执行这句话竟然执行了,这就意味着这个方法一定是在某个时刻被执行了吧,是不是?那什么时刻执行了呢?下面就两步代码,一步是实例化对象,一步打印成员,那咱把打印成员注释掉,来右建运行一遍,你看一下,诶,还是被执行了,这就可以充分的证明一件事情,什么事情呢?这个IIP方法的执行一定与这个实例绘画对象这一步有关,他都说是吧,我信,咱把它也注释了,你再看还有没有。有点运行,是不是什么也没有了,所以肯定是他这一步。操作触发了我们魔术方法init。所以它的触发时机是可以确定下来的,什么时候触发呢?实例化对象的时候啊,它叫做实例化对象。之后触发啊,触发很能说,为什么写之后呢,他不能说当时触发的吗?不是的啊,这个大家来了解一下,我们正常情况下要做出一个对象啊,它分两步,就是这个这一行代码实际上分为两步,哪两步呢?实例化对象的两步分别是第一步。
09:23
制作一个对象。一个对象,第二步叫为对象添加或叫初始化操作啊,初始化操作我们刚刚这个init,它的触发是这行代码没错,但实际上是由于第二步的操作触发了init,这个操作明白了吗?就相当于什么呀,我们现实中生一个小孩,那你生出来就完了吗?不会的,然生出来小孩之后,你是不是得把他身上的胎粪擦掉呀,给他洗个澡啊是不是,然后清理一下呼吸道啊,然后盖上谢子,这个时候才能报出产房来,是不是我们这里也是一样啊,这里是生出了这个孩子,然后后边是为这个孩子进行擦洗啊,各种各样的一些工作啊,就是初始化的一些工作,一个道理,那在这里边触发时机我们知道了,实际化对象之后,立刻就触发了,对不对,然后它的作用是给就算添加所有成员,那怎么加呢?哎,看好了。
10:21
来把这行代码解注释掉。我们注意iitt触发的时候是对象是不是已经做出来了,而且大家注意啊,Iitt里边是不是有个surf,所以这个surf实际上它接收的是谁呢?给大家打印一下看看好不好,Print这个SF让你看一看啊SE来右键运行一遍程序。是谁,是不是人类造出来这个对象,而且你要如果在后面再打印一遍这个,你如果想在后面啊,再打印一遍这个对象one的话。你会发现它两个其实就是一个,你看它俩是不是一模一样,包括内存地址是不是都一模一样的,所以告诉你在实例化对象的时候,会把做出来对象自动传到I it里边,然后你给他什么加衣服呀,加东西呀,加东西什么的是不是?所以初始化操作的时候呢,你要给对象加成员非常简单,因为对象已经给你了嘛,是不是未对象添加成员,对象已经给你了,就是selff呀,你要加什么成员直接点加就可以了,比如说我们要给他写一个什么呢?我们要给他写一个这个名字行不行啊,写一个性别吧,Six等于要么男要么女,是不是,或者说是随机生成,不过大家现在还没有学随机代码是不是,所以我就直接写吧,行不行?写一个难啊,因为我们还没有学过随机函数,那我在里边先固定写一个难行不行,那这个时候大家看好了,我们右键运行程序,程序不会报错是不是,然后呢,打印对象也没有问题啊,当然这个打印对象是最后面打印的啊,这个代码打印我想看对象里边是不是真的加了一个性别的成员呢,那右键运行程序。
11:52
大家来看是不是对象里边自带一个性别男啊,哎,还有年龄不是吗?来啊surf.age啊,刚出生的时候都是一岁吧,是不是等于一,那么对象里面会自动添加一个一岁的年龄。
12:07
而且还有其他的信息,比如说名字,大家是不是一般是生完孩子就会给孩子起名字是不是,那孩子的名字怎么办呢?来surf.name等于啊,比如说等于什么等于等于我们这个啊,写一个V压点的是不是六加一是不是六加一是不是等于七,等于七是不是好,然后没有问题啊,大家会发现啊,我们刚刚在这个iit方法里边添加的所有成员都会直接归到对象本身,看见了吗?因为我们后面打印的啊,注意啊,你后面打印的不就是对象的成员吗?是不是,所以只要在I it里边添加成员都是给对象加的,但是还有一个问题啊,什么问题呢?这名字不能写固定的,你是不是生完孩子之后给他起的名字,所以名字应该是在你什么呀,有了孩子之后,给他现起的吧。这就表示哦,我想把名字在这个是不是做生孩子的时候给他起好行不行呢?行,我们可以把这个name。
13:03
在这里边干什么事呢?不写固定的值,而是在这里边通过参数传递的方式传进去,也就说哎呀,我生出来这个对象的时候,我就给它起个名字,看见了吗?那名字你在这个human里边往里传了,谁来收呢?作为一个参数而言,你传进去肯定有人接收吧,是不是,所以看好了现在这个情况程序会报错。他告诉你什么呢?I it方法,它有一个刑参,但是却给了我两个食参,诶,好多,说我哪给了这个serve接受对象本身没什么好说的,那另一个对象啊,不,另一个十材谁给我的?很简单,就是在这里边传进去了,所以当你在实例化对象这个类的括号里边写一个参数的时候呢,I it就必须写一个形态类接收它了,比如说啊,比如说我们再写上一个什么呢?写一个叫孩子的名字his name行不行?那这个时候请注意我们在这里边写的刘佳怡就会传入我们I it的K的方法,K的这个不是k name参数当中被他接收,然后这个时候呢,干什么事呢?我们看好了,打印一遍给大家看看,好吧,我们这个kidd name kid name啊,Kidd就是小孩的意思嘛。
14:15
内,你就会发现,哎,刘佳怡是不是传进去了,所以呢,我们想给这个刚生出来的小孩加名字。要做的其实非常简单啊,实例化对象的时候,传入一个名字进去,在II里边写一个行态接收,同时在里边添加的时候把行参诶是不是带到我们的操作里面就可以了,这样一来的话,右键程序里边就会发现。然后孩子的这个对象的成员里边是不是自带一个name刘佳怡啊,是不是,你要不想也不想叫刘佳怡,那叫邓雨琪是不是?邓雨琪是不是六加一,六加一等于七嘛,是不是邓雨琪,那么邓宇琪邓雨琪来右键于程序运行你就会发现啊,这个小孩叫邓雨琪,看见了吗?所以说啊,我们iit就是为了对象添加成员的用的,当然对加成员的时候你可以什么呀,在这里边通过随机数自动分配写固定值也可以通过什么呀,实例化对象的时候传参数给I来接收,因为什么呀,你这个操作不就是触发了I it吗?所以在这里边写的参数就需要I it来接收了啊,当然第一个固定被S接收对象本身就不要想。
15:30
好了,那这个时候大家来看,那我们的参数是不是也可以确定了,参数有没有呢?有一个serve,这是自带的,它是接收啊当前的对象还有什么呢?其他的参数啊,它参数根据什么呢?根据实例化的括号来决定啊,实例例化的传参决定你实例化的过程当中,传一个参数啊,我就需要一个形态接收你传一个参数我就需要接收你也可以传多个叭如说。我们给他再来一个什么呢?再来起一个小名,是不是小名,咱叫他妮妮行不行,妮妮啊妮妮,也就说这个大名叫邓雨琪,小名叫妮妮,那妮妮你是不是应该什么呀,接收一下,对呀,所以这里边再加一个pet name啊,就是昵称的意思,那么在这里边我们就可以添加一个self.pet p pet name啊啊不是self.pet name等于pet name。
16:24
但是大家需要注意啊,什么注意呢?这个p name和这个P完全没关系。这个。它是什么呢?它是。In啊,In的行餐,而这个p name是什么?这里边s.p name点啊PA name,它是对象的成员完全不同的地方,只不刚刚好什么呀,刚好叫一个名字而已,是不是,嗯。所以这个大家在使用过程中需要注意啊,因为我们实际上工作过程中经常用这种方式啊,我形态接受了,然后对成员名也叫这个名完全可以使用的,因为他们互不干扰啊,好了,那这样一来关于I魔术方法就OK了,返回只有吗?
17:12
返回值是没有的,它是没有返回值的。很多说,那为什么不能写返回值啊,很简单啊,因为它的操作是一个执行过程方法,或者要过程函数,根本就没人接,没什么返回,你返回给谁?你返回给万接收吗?不能万接收的是什么?人家操作的对象对不对?所以你不能返回,千万注意啊,人家也没有返回是它有什么注意事项吗?没有什么注意事项,无啊,没有注意事项,这样一来的话,Iit方法应该会用了吧,而且我告诉你,Iit方法是我们日常工作中最常见的方法啊,所以它应该是五星重五星级中药啊。最重要的一个方法,因为我们在工作中用的最多的其实就是这个模方法,好了,那我们来接着来看啊,第一个方法给大家介绍完了in it,看第二个某式方法,第二个魔术法叫下划线,下划线六啊。
18:01
下半下半前new new嘛,大家都知道,就是新的意思,对不对,它叫什么呢?构造方法。构造方法啊,怎么说这个又是干啥的呀?好来,我们接着来看第二个魔术方法的使用,在这里边我们新建文件啊,右建新建一个Python文件。我们写一个new啊,但其实这么写有点违规啊,因为new算是一个保留关键字,所以这样写不太好,咱叫他嗯,New。叫它摩new吧,行不行,改个名叫摩的new啊,就是方法模生法new吧,摩new行不行,前面这个我也给你改改吧,前面这个咱改成把它改成叫做,哎,我进哪了,刚刚。那36呢?哎,我的方法让我写哪去了?摩缪啊,在这啊,把它移走啊,移到这里边来,刚刚这个iit我也给它改改名吧,好吧,咱就改成摩sir的iit行不行,来把它改个名,改名怎么改呢?点右键啊,然后点这个。
19:00
哎,我记得有一有一个改名字叫re,什么rename的字的啊,啊,不是这个。改名字在啊在这啊,在这里边rename看到没有改名字,咱叫它third啊,就是魔术,Third叫方法的意思啊,魔术方法啊,Me ODM third下线iit行吧,然后点击啊。改修改啊改成功了,来看一下new魔术法的作用,在讲new魔术方法的时候呢,我们啊,依然是用人类来做操作好不好,那在这里边我们干什么事呢?给大家写一个这个new魔说法啊。下划线下划线六我说下划线下划线拗啊下划线下划线我们叫它构造方法。啊,不是构造构造啊,构造方法。当然很多兄弟说什么叫构造方法呀,构造就是构建创造啊,就这么个意思,来看一下构造方法该怎么用呢?还是一样啊,写个人类我就不再写了,把刚刚这个人给他人类给它扣过去行不行?好把整个人类给大家复制过去。
20:08
好,复制过来,然后粘贴一下,把刚刚iit魔法删掉啊,我讲魔术方法会给大家一个个讲,放到一起容易混啊,好,那现在又是有了一个人类了,然后呢,那这个消s new模式法又是干什么用的呢?它有什么特征呢?来我们来记录一下行不行,依然是五个操作啊,有什么触发时,什么时候触发什么作用,是不是有什么参数返回值,来把上面这些信息给它删掉啊。我们先来看一下触发时机啊,行不行,就看一下这个到底什么时候能让我们这个逆我除法进行一个执行。好,在这里边返回代码里边,我们在这里边开始写一个什么呢?写一个new魔术方法啊,来这里边写上啊。魔术方法用。然后呢,DF我们写上下线下线new下线下线超生框,然后呢,这个CS注意看好了,是自己带的啊,不是我写的啊,自带的,然后print我们写上new,魔术方法被触发啊,或者写上new。
21:12
方法被处罚啊。好,然后呢,我们现在什么都不干,右键运行程序肯定不会有任何反应,对不对,然后下面开始实例化对象,实例化对象的时候呢,依然是Y等于我们的human human画框。OK,然后我们右键执行程序,你就会发现new已经被知触发了,上面写的new魔法,New方法被触发对不对?然而呢,大家看到了,整个代码里边就写了一个类,那也是了,类的时候根本就不会触发,那触发是不是只能在这儿啊,没错,确实是在这一步触发了。那这一步操作咱是不是之前说了分两步啊,这是实例化对象嘛,但是它分两步啊,实例化对象它分两步,第一步叫做制作对象,制作一个对象,第二步叫做什么呀?初始化对象,那我们初始化对象是不是已经被iit方法给触发了,是不是或者叫I是被他触发了,自然不可能是他捣的鬼啊,是不是,那就说明我们一件事情,谬的魔术方法一定是被他的第一个制作对象给触发的。
22:18
是吗?是啊,所以new出发的是不是不是这个制作对象的时候触发的是new。这也解释了为什么这里边写的是CF,而不是一个selff,为什么?因为你这个时候触发对象是还没做完啊,这里边自然不能写累了,写self是不是?哎,自然不能写对象了,写self了是不是,那写CS什么意思呢?就是累啊,是不是没有对象的时候,当我有累啊好,那这个时候触发时机我们已经掌握清楚了,什么时触发呢?它叫做实例化对象的时候触发,它不是不是实例化对象之后啊,人实例化对象的时候触发。那它有什么作用呢?诶。看好了,好多是这个没看明白,是不是有什么作用呢?好大家看好了,我现在给你打印这个print,打印这个问。
23:07
那么按照之前的操作,问是不是应该是一个对象啊,对不对,但是现在请你注意。One是一个no,你说什么都没有,那为什么呢?来看好了,你return,我给你变一个值啊,我一个一,你会发现打印的是一个一,我给你一个二,你打印的是一个二,看见没有很多说,哎,不应该给对象吗?怎么这个万一或是一或是二呢?很简单,因为这个new魔术方法,它用来控制对象的生成,也就说对象是否生成。生成是什么样的对象全在new方法当中进行管理与控制,所以魔术方法new的作用是什么呢?管理控制对象的生成啊,管理控制对象的生成过程,你想让它生成,它就生成,你不想让它生成,不好意思它就生成不了。
24:04
它就生成不了。所以这就是他的一个什么样作用,可能说这有这么有这么那个强悍吗?有大家看好了。下面给大家做一个事情,什么事情呢?啊,虽然有点重男轻女的意味啊,但是请大家理解,干什么事儿呢?我们要用他做一个只生男,这叫什么?呃,这个人如果是这个男的咱就生,他是女的咱就不生行不行?嗯,我说这个怎么做呀?啊,当然这个你需要往里传一个性别才行啊,你需要传一个性别进去,在这里边干什么事呢?我们在这里边啊。写一个参数用于传递,都写什么呀?就写男或者女,看懂了吗?如果是男的。我们就不要了,因为男的太多了,是不是如果是女的,我们就给他生出来行不行?好,就这么简单的一个要求,怎么来做呢?首先如果是这样操作的话,你会发现程序没什么语法错误对不对?但是没有得到对象,好返回代码当中啊,把刚刚这行代码注释掉,我们干什么事呢?我们来自己管理对象的生成,自己控制对象的生成,生成过程好。
25:16
单说是控制生成过程,实际上你只能控制生成还是不生成而已,然后在在这里边儿,我们需要传一个性别进去啊,比如说咱传一个女行不行,女咱说了女的生男的不生啊,因为现在男女体力失衡嘛,女的生。男的不生就不做出来就行了,不生。好,那当我在这里边传一个参数的时候呢,右键运行程序,程序会报错,会报什么错误呢。汇报这呃错进错误,我错进哦,这里边没写代码,写个pass占个位吧,行不行?好了,右键还既然写了pass也会报错啊,他会告诉你谬只有一个行参,但是你给了我两个参数,很多说,哎呀他俩怎么给俩参数呢?很简单,因为这个女也会传给new,很多说你刚刚不是说你这个括号里参数串个I it吗?没错啊,它既会串个it也会串个new,因为它俩根本就在一个过程当中嘛,是不是?所以实际上I it的参数个数,这个和new的参数个数是一样的啊,那在这里边我们传了个女之后,就需要在这里边设置一个形态类接收吗?好,我写一个参数叫six行不行?
26:24
那这个时候给大家打印一下这个six,你来看一下我们six右键运行程序。看我写一个女,你就得到一个女,然后当我给你一个男的时候,你就得到一个男啊,我给你一个男啊男,右键运行程序。你会发现,哎,是不是难就难,难就传进来了,是不是,所以我说了你传什么他都接收的。然后呢,接下来我们要控制对象的生成啊,那怎么样来生成对象就是一个问题了,好在这里边把这个注子调,我们已经知道CX会接触到男女了,是不是,那在这里边无非就判断呗,如果C它等于等于啊女。
27:03
我们要在这里边做的事情就是生成对象啊,并且返回啊,你不返回人收不到嘛,是不是如果是男的那就是else,是男的咱就要什么呀。叫做不生成对象啊,不生成对象啊就可以了,然后在这里边出现一个大问题了,可能说这对象怎么做呀,我不会呀,是不是没错,制作对象的过程确实不是我们管的,我们作为一个程序员或者使用Python的人而言啊,我们能管理的是他对象要不要生成,而不能管理它的生成过程。明白吗?就是这个结果你可以控制的,通过new来控制,但这个过程你没办法说怎么做呀,是不是这个你是做不了的,好很多说那怎么办呀,我们到底做还是不做呀,做呀,如果是你,你不是要做吗?那这个时候。我们就得借助另外一个工具来完成了。因为对象的制作过程,包括对象成员的操作,添加那些基本操作,全都是对象自带的。
28:07
谁带着呢?Object给你的,Object给你的。在这里边object我也给大家说了,它是所有类的负类,对不对?那么这个时候当你想制作对象的时候,你可以通过object点消消new。啊下线下六下线下线套上框把泪传进去就可以了。简单的说,这个。上帝之手啊,上帝之手。它是整个personth最底层的内容对象的创建,其实啊,我们为什么能实例化对象,其实很简单啊,你看我们之前在这里边没有写这个下线下谬的时候,或者不写it的时候,是不是这样可以做对象啊,为什么很简单,因为我们任何的类里边都有。New魔术方法。明白了吗?任何类里都有new,他说这个new哪来的呀,当你不写new魔术方法的时候,它会自动继承谁呢?我们这我们是不是说过任何类会继承object类对不对,它会自动继承object类,Object类里边实际上人家自带加上钮的。
29:18
信不信?好多说,哎呀,我怎么那么不信呢?行,大家来注意一个事项啊,我先把魔术方法的区域注释了。把这个注释了,也就说我现在代码里边肯定没有new网好,但是请大家看啊,我们现在通过什么呢?Hum human点消消下new来调用啊套框,你看它会不会报错。来程序是不是报错了,他说的是这玩意没参数,看到没有,他说的是兄围类没有参数,并没有提没有这个魔术法,如果你蒙的一个方法,你看它错误是不一样的。如果蒙一个方法他会,哎,这这太不给面子了,哪块报错了。哦,不对,是上面这个有问题啊,把这个注释掉啊,是这个问题啊,来右键运行一遍,把这个上面也注射了啊,你看一下我现在蒙的一个模块,它会告诉你没有这个方法对不对,但是我如果写人类点human,来你再看一下右键走,你他不会,他不会告诉你什么呀,方法不存在,而告诉你没有足够的参数,看见了吗?所以任何的类里边都有谬的。
30:23
这个new哪来的呢?是继承他的父类,因为任何类都默认继承object嘛,是不是继承他父类来的,而我们现在要做的事情是什么呢?哦,我希望说白了,你在这写new文化,实际上的是在重载啊,实际上是在重载我们object内部OB。J内部自带的下new。明白了吗?有人说,哦,原来这个new模方是一个重载的方法呀,没错啊,这是对I it,不是I it不是自带的,但是new是任何方法任何类都自带的,所以我们现在重载类里边的一个一用方法,你重载的时候,这个制作你是不是不会做呀,我们重载了之后,你就知道怎么做对象了吗?不是我们说了拿过来只是管控一下,做出来还是不做出来,但是真正做对象的方法都在什么object的new文法里边,所以这个时候我们把object的new拿过来。
31:20
然后你要做哪个类的对象呢?我把这个类传进去就可以了。好,他说,哎呀,我是不是这写human就行呀?没错啊,你确实应该在这写human的,我们这不是写人类吗?写human就可以,那么这个时候你其实就做出了一个对象了。用什么类啊。人类造出来的。他说是吗?没事,返回去看看不就完了吗,来。打印我们的万对象,你看一下它是不是一个人类的对象好不好?右键运行程序。人类就想,哎,缩进又又又又又哦,这个得占个位啊,不然语法错误啊,占位符没写啪,来右键运行程序。看一下返回知识,那是不是,那是因为我们给他了一个男吧,是不是好,你再给一个女。
32:04
你来右键运势程序,你看一下是不是人类的对象,是啊,所以啊,你要做对象,其实说白了我们都是借助object new,然后把你的类塞给他,他就会用这个类帮你做一个出来了,但是你不需要写human的,为什么呢?看见没有,这个CLS很多,这个CLS是谁呀?这个CS呀,CS它是class的缩写,也就是说当你使用new方法的时候,它会自动把当前类传到CS里边,看一下呗,行不行,给大家只是看一下啊,那在这里边print我们的CS,你看一下这个CS里边是不是我们叫做人类本身啊,来右键运行。看到没有打印的就是人类吧,上面打印的是不是就是人类,所以说呢,在这里边啊,我们算写这个new方法的时候,没有在类写类名了,一般情况下都直接把CS1放就可以了,因为人家会把类自动传进来嘛,这样一来的话,好注释一遍,右键运行程序,这样可以生成人类镜像。
33:06
然后呢,是女的,咱是不是就不生成就可以了,所以在里边你可以写个pass,或者写一个那。啊,是男的就不生成了,那么这个时候我们其实就重载完了这个new模范,它实现的效果是什么呢?如果你给一个女性别女进去,那么这个对象就可以制作出来。是不是有对象了,但是如果你给一个男或者其他的性别,不好意思啊,我们只要女的,所以右键执行。看到没有对象是做不出来的,所以在这里边我们就通过了new魔术方法来控制的对象生成与否,当然在这里边啊,你想做这个对象还得借助最基本的object里边的new方法来实现,明白了吗?当然啊,很多说那啊,既然你这样的话,传什么类就可以做出一个什么对象,我可不可以实现礼貌换太子的效果,比如说我要做人类对象的时候,传一个猴子进去,能不能造出一个猴子的对象?嗯,这个想法很天马行空,但是确实可以玩一玩。好吧,来,右键新建一个开始文件。
34:09
狸猫换太子啊,狸猫写错了,狸猫换太子,我就这么写了,好吧?OK,然后呢,Class这里有两个类,一个叫人类。PASS1下行不行?还有一个是什么类呢?猴子类啊,还有一个猴子类,猴子类写前面吧,因为这里边如果需要用猫坏太子的话,猴子里先有啊class啊monkey。好。这里我给大家写了两个类,Pass一下,写了两个类啊,第一个类,毫无疑问这是猴子类,是不是猴子类啊?猴子类什么后置啊猴子。哎,不是,这猴子猴子类,第二个,毫无疑问这是个人类呗,是不是?好,大家看好了,正常情况下我们实例化一个人类,这玩意简单直接是什么呀?好,我们写个人吧,等于Hun号上括号,那么这个时候我们打印这个人的对象的时候,你会发现啊,他会很清楚的告诉我们。
35:09
这就是一个人类的女像,是不是?那你既然说了可以狸猫换太子,那我可不可以干什么事呢?在这里边重载人类的方法看好了,叫做重载人类的构造方法,然后用猴子类来做人哈,用猴子类,什么玩意用猴子?用猴子类。来做人啊,做一个人的对象,来class啊,不不不不,魔术化重载DF下划线下划线new构造号下划线下划线考上括号。好在这里边参数不需要啊,后面是参数,咱先不用管它,然后呢,在这里边干什么事呢。使用猴子类啊,看好了,猴子类代替人类创建对象,如果你要用人类就简单了,直接ta一个什么呀,Object点下下new,就是让我们上帝之手帮我们来干活嘛,是不是你把C类遗传,那CS就是当前类,那当前类是不是就是人类啊,所以你创建出来的依然是人类对象啊。
36:16
是不是人类的人类的对象,但跳我这个不传CS,我传一个猴子monkey,你再看他的对象。学子,就像是不是我,明明实力化的是一个人类,怎么得到了一只猴子?这就是传说中的礼貌换太子啊,不过这玩意儿供你这个调皮的时候玩一下就可以了啊,仅供娱乐啊。仅供娱乐。没事别瞎捣鼓啊,没事别玩啊,容易把自己玩残了,真正开发过程当中我们没有这种需求的,或者几乎没遇遇到这种需求啊,所以这个大家只需要了解,可以这么玩就可以了,好不好?那这样的话,两个魔术方法就给大家介绍完了,In,你的魔术方法和我们的new魔术方法,这两个方法还是比较重要的啊,来接着再给大家讲一个魔术方法行不行?叫什么魔术方法呢?哎,这个记完了吗?好像没记完吧,密魔方法没记完啊,它的参数啊也是根据一个,它是注意啊,一个CS接收。
37:18
当前类啊,当前的类啊,写错了当前的类,其他的参数根据实例化参数决定啊,根据实例化的参数决定,这个面的返回值是可有可无啊。可有可无,但是注意如果没有返回值啊,没有返回值实例化结果为now啊,当然你要反馈什么就是什么,对不对?注意事项是有的,什么注意事项呢?注意new魔术方法跟init啊,跟it的魔术方法的参数。
38:01
一致。就是一样的,除了第一个啊,第一个一个数对像一个类嘛,是不是除了第一个啊,剩下的参数是一模一样的,因为他们两个是在一个过程当中出发的嘛,是不是,所以方法是一样的,来给大家再本小节再讲最后一个魔术方法行不行?讲个什么魔术方法呢?叫de魔术法。第三个啊,DL我说方法。也是双下划线开头的BL啊,下线下线。魔术方法啊,那说这个方法叫什么名呢?它叫做析构方法啊,吸构啊吸构。好多啥,啥叫吸构啊,其实吸构就是吸出的意思,大家都知道,那个我们经常在化学里边会讲什么析出金属啊,析出单质啊,是不是构就是构造,稀构其实就是拆解构造,或者你可以理解为什么拆构,反正差不多啊,拆构。你看这样理解拆构方法。够呢?拆购怎么没有那个字了啊?
39:01
构造的构呢?构造啊,拆构构造一个拆构方法,这样看着不好看多了,反正一跟拆差不多,所以其实啊,它跟上面的new是反向来操作了,一个是做对象,一个是什么呢?瓦解对象啊瓦解对象,然后呢,在这里边啊,老规矩还是我们那五条,把这五条拿过来,来学一下这个魔术方法的一个应用。把这些数据先删掉,我们一会儿通过操作来完成。来,我们再写一个新的文件,来试验一下这个析构方法,好吧。好保存一下,然后呢,新建一个文件,其实想想也很简单啊,我们正常情况下,一个人生出来的时候,你要给他做一些操作对不对?哎,什么上户口啊,写姓名啊是不是,擦擦身子包个衣服呀是不是,但是你别忘了,人要是去世的时候,人要离世的时候,你还要做很多事情吧啊,销户口啊是不是,然后呢,各种各样的信息抹去呀,等等等等等,其实熄活方法就是干这个东西的啊,那我们再来写一个,呃,找一贴上没事没事的方法当中的点。
40:09
好,然后我们依然是写人类啊,当然我就不再费劲了,我依然是直接复制粘贴一份行不行,把人的类复制过来。然后呢,把这个魔术方咱删掉啊,魔术方咱删掉。好,然后呢,上面这个写成我们的下象限Del啊下限下限魔术方法。好,然后呢,接着来看啊,我们现在干什么事呢?我们现在实例化一个对象好不好,好实例化一个对象先。哎,按错了,所以按错了。我一会把下面这个收回去啊,好实例化一个对象,这个对大家来说没什么难度嘛。实例化。一个对象十。实,哎,为什么写出汉字来实例化?一个对象好,那在这里边万。
41:02
就等于我们human human,这样是不是人类对象就有了,有问题吗?没有问题啊,因为我们也没干什么操作嘛,所以这样又被具备了一个人的对象。看见了吗?好,那这个模术方法干什么用的呢?来,我们给它写上去行不行?我们一般情况下会把吸构方法写到最后啊,因为他毕竟是没有的时候才做的一些事情,是不是机构方法,咱你写前面也不会有任何影响啊,机构方法这只是一些编程习惯。好,西口法DL啊,下划线下划线Del下划线下限啊,小写啊D下下限套上括号,然后在这里边print,我们写上一句叫做Del方法被除法。好,然后呢,右键运行程序看结果。大家会发现,哎,电压方法已经被触发了呀,是不是好?那么问题就来了,到底是谁触发了吸光方法是谁呢?很多学生说,哎呀,是打印吗?注视角这一步来右键运行一遍。
42:00
看见没有,触发了很多,说是这一步吗?右键它将会消失。但是我告诉你啊,它并不是在这里边触发的。并不是在这里面触发的很多人,为什么呢?来加一步操作你就知道了,我在它后边打印一行等号行不行。你会发现。它在等号之前并没有被触罚过,而我们的程程序顺序结构是不是应该是先实际化对象,然后再执行这个代码呀,而你会发现第二方法是在输出之后,所以是在这个位置是吧,触发的模块,好,这就奇怪了,这到底是什么时候触发的呢?它不是实例化的过程中触发的呀,确实也不是,那后面啥也没干呢?诶,确实是在什么都没干的时候出发,我们表面上看后面程序确实没有代码了。但是Python作为高级语言,在运行完当前页面就是当前脚本之后,它会对当前页面中不再使用的文件、信息、变量等进行一个回收操作,就在回收过程当中触发的Y什么时候触发呢?它的触发时机是对象对什么叫做对象被系统回收的时候自动出发。
43:18
所以它的触发你是看不见的,好,你是不是我只想看见,能不能看见呢?可以的。可以看见的老师,那我是不是可以主动删除对象啊,没错,当你主动删除对象的时候,它就会什么呀,看好了内存就会自动就会提前去回收了,主动删除对写错了啊,主动删除对象我们这边直接D换就可以了,D当记用果是不是删变量的,没错,当你把这个变量一删,那么当前对象没有变量用了,是不是就会被系统回收掉,这个时候你会发现。哎,他确实在等号前面被触发了,看见没有,你是可以控制它的触发时间的,你什么都不做,他一定是在最后出发了,但是如果我在什么呀,最后之前就已经把变量删除了。
44:02
那么这个时候系统会回收对象的系这个时候删除变量啊,系统回收对象,那再会触发了,那为什么我们不在这里边写上DL的数出发呢?因为D会出发。不是DL的,应该这样说,EL不一定触发,但是不DL它也会触发啊,所以好多是这个这个E绕是不是什么意思呢?你看好了,你刚刚的对象是不是只有一个变量在使用啊,但是你看好了,我们在这里边加一步,将对象同时赋值给另一个变量啊,同时赋值。给另外一个变量,那我们就可以在里边啊写上to,等于什么呢?One,意思就是啊,原来现在这一个人类的对象,刚刚造出来的这个万也用了它,To也用了他,这有点像什么呀,就是一个人用两个身份证一样,有点像一个人用两个身份证啊,那我删了一个身份证。
45:04
这个人诶,是不是还能用另一个身份证在社会上活动啊,所以他不会被回收的,你看好了依然在最后触发,所以你第一次的低谣并没有什么呀,触发这个DLY啊,删除这个变量,并没有触发我们的魔术法DL,原因很简单啊,你把删了,人家to是不是还用着这个对象本身啊,所以你是没法回收的。但是呢,如果我在里边在dl two就可回收了,Dl two这次再删,那是没有任何变量使用这个对象了,系统会认为该变量没用了,该回收了,咔嚓是不是又在前面触发了,所以在里边给大家写的是什么呀,系统回收的时候就能触发,并不是DL一定触发DL啊,不一定触发。这个千万注意啊,另外它有什么作用,作用在现在我们可能给大家写不了什么,实际上代码,因为我们现在没有写大型的工程项目啊,那其实很简单啊,它的作用就是回收啊,系统回收叫做叫做程序使用过程中,过程中的信息和变量等。
46:11
就这么个东西,比如说干什么事儿呢?我们这里边啊,假设说有一个文件操作的一个什么呢?一个类吧,那我先得打开文件,然后往文件里写东西,然后关闭文件,就分这么三步,那实际上这个就可以把关闭文件放这里边,也就说它的作用就是负责处理事后事的啊,负责处理后事的就类似于你做完了,你用完了就得干什么呀,把它回收了,我们在班级里上课对不对,那你早晨来上课坐在座位上,那晚上走的时候是不是得保洁给你打,是不是得保洁给你打扫卫生,把你屋里收拾收拾啊,就这意思,就是做回收打扫工作用的啊,他有没有擦数呢?就一个selff啊,没法传一个self接收当前对象。接收啊收接收当前对象,他有返回值吗?五返回你看其实你很简单啊,没人给他传参数是因为没地方传对不对,你不能在Bel传吧,你后面没东西也不可能传啊,没有返回值是也没人能接收,所以它既没有返回值,也没有额外的参数啊,注意事项也没有。
47:20
你只需要注意一下它的触发时机就可以了啊,它的作用就是回收一些信息,用用的过程当中我想把它给删掉,就可以这么做啊,因为我们在开发过程当中啊,经常什么呀,哎呀,比如说在这里,在这的我们经常在开发过程当中,我打开了某个图片,打开了某个文件,连接了数据库,那我用完了,你是不是得手动关太麻烦了,所以我们会把手动关的操作全都写到D的,意思是我用完了它程序按照类的特征会自动帮我关的是这个东西,所以回收自营的EL某充啊。好了,那这三个魔术方法算是我们什么呢?呃,特别是iit是最常用的,DL用的和相对少一点,New用的也相对少一点,这三个魔术方法讲完了之后,我相信大家对魔术方法会有一个简单的认识,对不对?我们别着急,后面会继续为大家讲解其他的魔术方法。好了,感谢大家收看本小节内容,我们下一小节再见。
我来说两句