00:00
好,对于类呢,我们已经有了一个大体的了解,但是我们现在来看看我们现在所定的这个类,它有没有什么问题啊,那这样我们来新建一个文件来说一下啊,我们来一个零三,诶我们来说什么呢?诶说一个我们这个诶类的,呃,对象的一个初始化。诶第二一个PY,那这样啊,我们还是先来定义这样一个类啊,直接我们来一个这个class啊,我们这叫做一个什么呢?诶还是我们叫做一个person,那刚才说了我们的类里边可以有属性,像name,我这等于一个孙悟空,这个是不是就是一个属性啊,哎,然后还可以有什么,还可以有方法,哎方法,比如说我这直接定义一个什么呢?定义一个我们叫做一个c hello啊c hello,那你注意了,定义方法的时候,我们这必须得传一个self作为参数,Self表示是谁,调用self是不是就是这样,哎,P1调用的self就是P1 p2调用self就是P2,那在这里我可以简单的写一下,哎,可以写什么呀,写一个大家好,大家好,诶我是,然后我直接来个百分之S,我这直接百分之什么呀,哎,百分之来一个s.name啊s.name那这里我们现在是不是就可以用它来创建对象了,哎,比如说我这直接来一个P,等于一个这个person。
01:21
直接调用我们这个类啊,来创建对象,那这个时候我直接来什么呢?诶,来一个p1.1个c hello,直接一执行走一个是不是大家好,我是孙悟空啊,哎,我是孙悟空,但是现在的问题是我们来看P2,如果我再创建一个对象叫P2,我如果来一个p2.chello,他是不是也是孙悟空啊,啊,也是孙悟空,那我们说了,在我们类当中所创建的这些内容啊,在我们类当中所定义的这些内容,包括变量,包括我们的函数,它实际上是不是都会成为公共的属性,公共的方法呀?哎,公共的就是说这些东西是所有实例共享的,那关于这些东西我们是不是在笔记中已经写了,诶,但是问题来了,我们的对象的确有共享东西,但是我们先说属性需不需要共享,诶属性是不需要,诶一般情况下是不需要共享的,因为我们每一个对象,我们说了我们的对象,我们的类是对我们现实生活中一个抽象,我们每一个对象里的数据一不一。
02:21
一样啊,哎不一样,每一个人的年龄一不一样啊,哎不一样,你姓名一不一样啊,性别一不一样啊,这些是不是都是不同的呀,哎都是不同的,而现在这种情况,你给它写成一样的,是不是不符合我们实际,或者说实际上是不满足我们要求的,所以像这种东西我们一般情况下不会定义,所以我一般情况下干嘛呢?哎,不会直接往这里面定义属性,好,那你这不定义属性,那那是这么说属性,属性是不一样的,但是方法一不一样,哎方法实际上大体上都一样,为什么?哎,我c hello p1c hello p2c hello,我说的内容是不是都一样,除了名字不一样,我们在这儿通过self来写,剩下的是不是都一样,哎,都一样,所以方法一般直接在这儿写就行了,而属性是不需要写的啊,属性是不能写的,那问题来了,现在我这里边没有内幕属性了,对吧,没有内幕属性了,我这一执行走一个,诶你看是不是就报错了,哎,Object,诶person object has no attribute name没有。
03:21
内幕属性,那这时候怎么办?那这个时候就要求我每创建一个对象,我要干嘛呢?哎,我要手动哎,我要手动哎向我们这个对象中添加什么呢?哎,Name属性,我直接来一个p1.1个name,等于一个孙悟空,诶然后呢,我这来什么呢?p2.1个name等于一个这个猪八戒啊猪八戒,那现在我们的P1P2是不是都有内幕属性了?好,我现在调的P2 p2是不是猪八戒呀,应该是什么呀?哈喽,大家好,我是猪八戒,那再来看,我把它改成p1.1个c hello,我这一直行是不是hello喽,大家好,我是孙悟空啊,哎,我是孙悟空,那接下来我们再来一个,来一个P3,等于一个这个person,我们这是不是又创建了一个对象,那这个时候我用P3.chello,这个时候行不行,这个时行不行,哎,这个时候很明显是不行的,为什么?首先我们这一执行走一个干嘛了,是报错了啊就报错了,为什么?因为我们在P3里边是没有。
04:21
指定这个内幕属性在P3里没有指定,而在我们类里边也没有定义,所以你这掉的时候,它是是不是找不到那个内幕属性,于是就报错了,告诉你谁谁谁,诶没有什么,没有name幕这个属性就报错了,诶那这时候怎么办呀,这时候其实这个问题很简单,那我在这儿我是不是就写一个P3.1个name等于猪八戒就行了,哎,等于猪八戒就行了,在这写上就行了,但是这么写总会觉得有,诶等于沙和尚,等于沙和尚你抓戒已经有了,对吧,发现你等于再等于抓戒也没关系啊,但是你会发现我这么写啊,咱们先执行一下,一执行是不是我杀和尚是没问题的,但是你总会发现我这么写总会有一个地方很别扭,首先现在很明显,这个name,这个东西是我们person里边必须的,对吧?这第一个问题,Name是person里边必须的,你必须有name,如果没有name,我这个person对象,它就不称之为一个person对象,因为我person现在对我这个person来说。
05:21
最基本的是不是就是一个name呀,你没有name你压根都称不上一个person,因为我这个say hello,我是不是还要用这个name呀,诶没有name这个不称之为一个person,所以注意这里内幕是必须的啊,我们这来说一下,哎目前来讲,哎对于我们这个person类,Person类来说,我们的什么呢?哎,我们的name是必须的啊,Name是必须的,并且什么呢?哎,并且我们这个每一个对象中的这个内幕属性都是什么呀?哎基本上啊,基本上都是不同的,哎你以每个人的名字大就是大,当然有相有重名的情况,但是大体上是不是都是不同的呀,哎都是不同的,所以诶首先内幕是必须的,然后第二一个内幕属性基本上都是不同的,那这首先说第一个问题,我这个内幕能不能写到类里?
06:19
哎,肯定不行,为什么?因为这是不同的,你写类里边是不是都是相同的了,哎都是相同了,那不能写类里边,那它又是必须的,而什么呢?而我们什么呢?哎,我们现在是,哎将我们这个内幕属性,哎在什么呢?在定义完我们这个对象以后,手动干嘛呀?诶手动添加到我们什么呢?手动添加到我们这个对象中,那首先我们来说这两个步骤他们是不是紧密关联,首先我们说了,我写完第八行代码,我不写第十行行不行,没问题,它是不会,你你报啊什么时候报错,直到你去调c hello这个方法的时候,是不是才报错,你定的时候是不会报错,也就是说你在定义这么一个对象,你在创建这么一个对象的时候,如果你不知道这个对象里需要内幕属性。
07:15
你是不这很容易被你忽略掉,哎被你忽略掉,但是内幕属性是不是必须的,哎是必须的,所以注意现在是将内幕属性在定义为对象以后,手动添加到对象中,那这种情况,诶这种方式,这种方式很容易什么呀?哎很容易出现错误,怎么就很容易出现错误,如果你忘了写这个name,那这时候是不是就出错了啊,如果你忘了写这个name,这时候出错了,那同学说老师那你就这样呗,你这写个name是吧,你这写一个默认值,默认值,那这样你忘了以后,他是不是就是默认值了,那这也是问题,那这样如果我的用户忘了的话,那将会导致去用我这个类的时候,你忘了这个写name,会导致我出现一大批的什么呀,Name为默认值的这个person对象对吧?所以这么写也不好啊,也不好,所以我们怎么能确保一件事儿,确保什么呢?确保我们希望啊,我们先说一下我们希望什么,诶,我们希望什么呢?我们希望。
08:16
用户,诶在创建对象时,诶或者说什么呢?诶在创建对象时诶必须干嘛呢?诶传递内幕属性啊,必须设置内幕属性,必须设置我们这个内幕属性,如果不设置啊,如果不设置将会什么呢?诶对象将无法创建啊将无法创建,那就是说现在你实际上不写name,它一个错也不会给你报对吧?那我们需要什么呀?诶如果这里边没有name,我直接给你干嘛呀,报错我告诉你我这需要name,你不传name你就不行,对吧?告诉你name幕是一个什么呀?诶必须的,所以我希望什么呀?在创建对象时必须设置name幕属性,如果不设置对象将无法创建,并且什么呢?诶并且我们说什么呀?诶属性的创建应该什么呀?诶应该是自动完成的啊,自动完成的而什么呢?而不是,哎在创建对象以后干嘛呀,哎手动完成,诶也就是说我希。
09:16
放什么我这个一个步骤,我直接来一个P1等于person,它给我创建对象,并且同时往这个对象里给我添加了一个内幕属性,而不是我自己去写的,懂这意思吧,一旦是我自己写的这个步骤很容易被我忽略掉啊,很容易被我忽略掉,那这个时候我们要怎么办呢?这个时候我们要怎么办?这是我们一个期望,我这么说应该能懂吧,哎,咱们先把这问题总结一下啊,现在我们整了一个类,我们说了类里边的属性一般都是不同的,每一个对象的属性应该都是不同的,所以我如果把属性直接定义到类里是有问题的,所以我的现在的解决方式是干嘛呢?诶,我手动把属性添加到每个对象里,这样是不是保证我每个对象里的属性值是不一样的,是不一样的,每个对象有自己的属性对吧,但是现在的问题是我这个的确确保我们的属性唯一了,不重复了,诶就是每个对象有自己的属性了,但是这一个步骤是不是。
10:16
这很容易被我忽略呀,哎,这个步骤很容易被我忽略,并且什么,哎,并且如果你不写的话,他也没有任何错,没有任何错,那现在我们希望两件事儿,第一个告诉我们的使用者谁去调用我这个类,我要告诉他我的这个值的这个内幕是必须的,这是第一个,第二一个它是自动完成的,我不需要去单独再写一个东西,懂这意思吧,哎,不需要单独写这个用,那怎么办?那怎么办?先我把这个先注掉,那这个事儿要怎么办?那首先我们希望什么?我们希望的是当你这个对象创建以后,就自动的向对象里去添加什么呢?诶去添加属性诶。
11:04
那问题就来了,我怎么知道这个对象是什么时候创建的?我怎么知道这个对象是什么时候创建的,那注意了,在这里我们来说一下,在我们这个类中,我们可以定义什么呢?哎,定义一些这个什么呀,叫做特殊方法啊,特殊方法或者呢叫做什么呀,叫做魔术方法都行,你也可以叫特殊方法,也可以叫做魔术方法,那什么叫特殊方法,什么叫魔术方法,咱们先简单理解特殊方法,诶特殊方法都是以什么呢?以我们这个双斜,诶双下划线啊,双下划线开头,双下划线结尾的方法,哎,那这些话都有特点啊,他们既以双下划线开头,又以双滑下划线结尾,那这些方法有很多啊,有很多在这里边我们先说一种啊,先说一种叫什么呢?诶,我直接定义一个叫做DEF,叫什么呢?诶叫做一个in it,诶叫做一个in it啊,我们来一个下划线,双下划线开头啊,双下划线开。
12:09
你看这写了,当我写一个双下划线,它是不是给我出现一个magic,诶magic魔术对吧,魔术直接打,你看它给我默认给我出来一个什么,出来一个in it,那注意这个就是一个魔术方法,你要看到在类里边出现这种结构,诶这方法很特别,这名很特别,前边出了一个双下划向,后边出了一个双下方向,那注意这个就是一个魔术方法,这个就是一个特术方法啊那我们来说一下每一个咱们先说啊特殊方法哎,需要我们自己调用啊,不需要我们自己调用,那现在来看我这定义的是不是一个in it呀,那这in it我能不能调,我能不能调,那是个方法,我们来试试呗,我来试试啊,我直接来一个P1,等于一个这个person,哎,Person直接来什么呢?p1.1个下划线一个in,我们来这儿直接一执行走一个,诶没有任何没有任何错对吧,没有任何错在这,我们来一直打印一下吧,打印一下我们就来一个这个hello,一保存走一个它。
13:09
是不是也可以执行啊,诶,但是注意你会发现什么,它出现了两次这哈,是不是打印两次啊,但是注意我这掉了几次,我这儿只掉了一次啊,只掉了一次,也就是说这个魔术方法,特殊方法我们能不能掉,很明显我是可以掉的,但是为什么我掉一次出现两次,那我们先说这个问题啊,先这个问题,特殊方法不需要我们自己调用来,也也就是什么呀,哎,就是说我们不要去尝试什么呀,哎,我们不要尝试去调用什么呀,去调用我们这个特殊方法,也就说像我这个这个步骤你不要去做啊,不要去做,哎不要这么做,他不需要你这么做啊,不要这么做,这个是不好的啊,不要去尝试这种方式,诶那问题来了,那你说我定义这么一个方法,你不去调,你不去调,那我干嘛要定义,我定义这么一个意义的方法,你不调,那现在注意了啊,我现在是把这个。
14:09
P一点音呢,我给住了,现在我调没调这个方法,调没掉这个方法,哎没有调,那注意了,我们来看一下,执行一下,诶hello,执没执行执行了对吧?来我改一个啊,我改一个,改一什么呢?诶音译的方法执行了啊in的方法执行了,这一保存我一执行掉没掉,诶掉了确实是掉了,但是我这儿有没有掉啊。没有掉吧,哎,没有掉,那是谁掉的呀?哎,那这里简单理解就是我们的解析器去掉的啊,简单理解就是我们解析器掉的,那我们说了特殊方法将会什么呢?诶特殊方法将会什么呢?诶将会在我们这个特殊的时刻,诶自动调用啊,单会在特殊的时刻自动调用,所以注意不需要我们去调啊,不需要我们去调,所以诶我们你在学习的时候,你可以自己比如说调一个阴影的玩一下就OK了,你开发的时候千万不要这么调啊,千万不要这个是我们说了它在特殊的时刻自动调用,所以你要学习特殊方法。
15:13
哎,学习特殊方法,你就要搞清楚一个,第一个叫什么呀,哎,特殊方法,哎什么时候调用,什么时候调用,然后第二一个,诶特殊方法有什么作用啊,有什么作用,所以以后我们还会说一些特殊方法,你只要看到这种,你都要知道它是特殊方法啊,特殊方法或者叫魔术方法,那我们现在要研究一个特殊方法,研究一个魔术方法,主要就研究这两个问题,一个是什么时候掉,一个它有什么用啊,有什么用,那我们来说一下音译它是什么时候掉的啊,音译它什么时候掉的,那音译呢,你会发现什么呢?咱们先保存一下啊,我这先关掉,关掉,我这保存一下,现在你会发现直行了,对吧,执行了再来看啊,我这来走走走,我来什么呢?P2。
16:03
P3。批次一保存看着啊,我这一执行1234执行了几次,执行了四次啊,执行了四次,为什么了四次,我创建了几个对象,创建了四个对象,你会发现我创建了四个对象,这音译它是不是就执行了四次呀?那我能不能说我每使用类这个类创建一个对象,这个音译它就会执行一次,哎,的确可以这么说啊,的确可以这么说,那现在我们说了,它到底什么时候掉的,那什么时候掉的,那之前我们去记笔记的时候,我们说了一个我们这个类使用类去创建对象的一个流程啊是吧,那我们来写一下,我把这粘过来啊,我们来粘过来在这儿来说一下,诶创建对象的一个流程,简单来说,我这写什么呢?P,哎,等于一个person。诶的一个什么呢?哎的这个运行流程,这个我们之前写的时候我就说了,这是一个简化的流程,它并不是一个完整的流程,那完整的流程应该是什么?首先啊,首先我们这是不是有一个P1,所以第一件事我先创建一个什么,我先创建一个变量P啊先创建一个变量P,然后第二件事儿我要干嘛。
17:21
诶,我要在内存中创建一个新的对象啊,我要在内存中创建一个新的对象,因为我在这儿是不是调用这个类啊,哎,调用类我就要创建一个新对象,然后之前我们写的实际上是将对象的ID赋值给变量,但是实际上这是最后一步,我们在这儿先暂且将它定为什么呢?暂且先先将它定为这个什么呀,将它定为这个第五步啊,我们暂且将它定为第五步,那这是第五步定义完了,那然后呢,然后干嘛?那注意了,现在我们还有一个第三步,还有一个第四步,那这第三步是什么?第四步是什么?那首先你会发现,当我去创建这个P等于P的时候,你会发现第一件事,我们看到这个我写到啊,不对,我写错位置了,对吧?我应该是写到我们的这个类的初始化啊,写到这我们这个创建对象的一个流程啊,那我们刚才看到了,首先我们这个很明白创建变量,第二一个创建对象也明白。
18:21
我们已经看到这个对象了,那第三一个,第四一个会是什么?那首先我们已经看到的是不是音译的方法执行了,哎,所以第三第四肯定有一个是一个音译的方法执行,对吧?肯定是有一个一译的方法执行,那到底是第三还是第四呢?哎,那我们先假设啊,咱们先写上一个,哎写比如说我就写到第三者,咱们就先,我现在不知道,我就写到了音译的方法干嘛呢?哎,音译的方法执行啊,In的方法执行,那第四步还有什么,还有什么,那注意了。我在类里边是不是有代码啊,我在这类里边我要来一个A等于一,诶这来一个什么呢?A等于一,然后这来一个B等于二,那这些是不是都是我们的这个类里的代码啊,那我里代码,我类里的代码是不是也得执行啊?哎,你类里边代码不执行,你这A哪来的,B哪来的,这方法哪来的,对吧?所以还有一个步骤是要执行我类当中的这些代码块中代码,对吧?那问题就来了,是代码块中的代码先执行,还是音译的先执行?其实我不说,你猜一猜着,因为音译它是不是也属于代码块里,那到底谁来执行?哎,你想代码块不执行in it能有吗?对吧?所以我们来干嘛呢?我试一下啊,在这儿我就写一个print,这是什么呢?这是我这个person,这个什么呢?诶代码块哎中的这个代码我们来看看啊,看看是他先执行还是音译的先执行,我这一执行来看谁先执行的。
19:54
是不是代码块中代码还执行的,哎,并且它只执行了什么呀,只执行了一次啊,只执行了一次,他在什么时候执行的,它是在我们这个类定义的时候执行的啊,类定义的时候执行的,所以这里边我们是干嘛。
20:09
来,那我们说了,是不是应该把它放在这儿啊,哎,所以这应该写个什么呢?这应该写一个这个我们这个执行我们这个类的什么呢?诶代码块中的这个代码,诶那我们注意了,这个东西它只在什么呢?只在我们这个类定义的这个时候干嘛呢?执行一次啊,只在类丁的时候执行一次,所以其实这个东西啊,我写在这儿不合适啊,不合适,因为实际上这一个东西它是比我们这个变量也好,这些东西都都好干嘛呀,它都先执行的,即使你一个对象都不创建,你这一保存是不是它也会执行啊,诶它也会执行,所以这样咱们把它更写的严谨一点,这个呢我就不写了啊,这我就不写了,我就是一个12344个步骤啊,四个步骤,所以当我们写了一个P1等于P的时候,它的运行流程什么?第一个叫做创建变量对吧,第二一个在内存中创建一个新的对象啊,怎么创建,咱们先不管它啊,然后第三一个干嘛呢?调用。
21:09
我们这个音译的这个魔术方法,去执行这个方法啊,执行这个方法,然后第四一个将对象的ID干嘛呢?赋值给我们这个P1,那这样我们这个P1是不是有关联了,哎,我们这个P1跟我们这个对象就有关联了,也就是说你会发现我们这个音译的这个特殊方法,它是什么时候执行的,哎,它是不是在对象创建完以后立即执行啊,哎立即执行,所以注意我们说了,第一个什么时候调用啊,什么时候调用,我们来说一下in it我直接简写了啊in it会在什么呢?哎,会在我们这个对象创建以后啊,对象创建以后,哎立刻执行啊,立刻执行,也就是说你每创建一个对象,对象创建完了,你还没有把这个对象的ID赋值给那个变量呢,音译它干嘛已经调用啊,每创建一个对象就会调用一个什么,就会调用一个你啊,每创建一个,你会发现刚才我这创建了四个对象,那实际上是不是就调用了四个音译。
22:09
对哎,创建调用四了四次阴影啊,每次对象一创建完这个阴影,它就会干嘛,就会调用啊,就会调用好,那这pass其实不用写了,诶那同学说了是我现在知道什么时候掉了,它是在对象创建完了以后立刻就调用,它有啥用啊,它有啥用啊。有啥用,有什么用?哎,那注意了,那我们要看一下in译是什么意思,In什么意思,In译的意思叫做初始化,那以后你看到这玩意儿啊in it,那在任何语言里看到in it,它都表示什么呀,初始化,所以它的作用也很简单,In it我们可以干嘛呢?那既然in it调用的时候,这个对象是不是刚创建完毕啊,哎,所以in it可以用来干嘛呢?哎,像我们这个新创建的这个对象中干嘛呢?诶初始化变量啊,初始化我们这个什么呀?属性啊,初始化属性,也就是说你这个阴的一调,这对象有没有呢?啊对象已经有了,所以你在这儿打印一下这个S,你来看看啊,S这一执行S是不是都有了,诶你看这一下是不是创建了四个对象,哎四个对象,那现在就是说我可以干嘛呢?我可以直接在音译当中向我们这个变量中干嘛呢?诶初始化啊,初始向我们这个对象中初始化属性,那怎么来来在这我们来写一下。
23:29
那self已经有了,那我可以干嘛呀?哎,我可以通过我们这个self,哎,像我们这个新建的这个对象中,诶初始化属性,比如说我直接来一个self,点一个name,等于一个什么呢?等于个孙悟空啊self.name等于孙悟空,那等于说我这个是每掉一次都会添加一个孙悟空啊,诶那这个时候我们来看,那这样啊,我们整完了以后呢,现在我看不出来对吧,看不出来我干嘛呢?我来一个P一点c namep一点c hello,那注意这个时候你说他能不能出现名字能不能出现,诶必然能出,诶同学说老师你这没有指定name,为什么能出现,为什么?因为我在in it里边,Self是不表示我当前对象啊,那我往self里添加一个name属性,是不是就等于往当前对象里添加内幕属性啊,诶我们这一保存这一执行走一个是不是孙悟空啊,诶来看着我来一个P2点c hello1保存走你一个是不是也是孙啊。
24:29
我来一个P3.chello,走一个是不是也是孙悟空,懂这意思吧?哎,都是孙悟空就都有了,诶同学看到这就觉得奇怪了,是吧?老师你这么写跟之前有什么区别呀,之前你这写一个,哎,比如说我在这儿,在我们这个类里边,我直接写一个name等于孙悟空,这两个有什么区别?注意有什么区别,有什么区别,我在这儿直接写一个name等于孙悟空,这个name属于是在哪里,是在类对象里啊,类对象里也就说它只有一个,只会创建一次,因为类是不是只在执行的时候创建一次,诶类对象里,而我在这儿写一个cf.name等于孙悟空,这是在哪?诶这个虽然看起来效果是一样,但是这个实际上是在我们实例对象里吧,诶实力对象里,具体来看我们这个图,诶,如果我直接写到这儿的话,我们这个内是在哪,是在这个类对象中啊,如而我是通过self点内,它在哪,它是在我们的实例对象中。
25:29
注意这个是有本质区别的啊,是有本质区别的,一定注意这两个一个区别,这个是在类对象里,而这种方式是在什么呀,我们的实例当中啊,实例当中一定注意啊,一定注意好,那同学说老师你说半天这个没啥意义。虽然一个在类对象中,一个在实际对象中,但是实际上效果都是一样的,效果就是现在我所创建的每一个对象,它的值,它的内幕属性值,是不是都是孙悟空,都是孙悟空,哎,对,的确如此,的确都是孙悟空。
26:03
那怎么办?那现在注意,我现在是不是等于把这个孙悟空在我们这个阴译的函数里写死了,等于你每创建这对象它的内幕都是孙悟空,每创建一个内都是孙悟空,那你还不如在类里边定一个公共的对属性对吧,公共的属性,那这这样还麻烦了,那怎么办?那首先说这能不能写死,不能写死不能写字怎么办?哎,不能写死非常简单,我是不是直接把这个直从外边以参数的形式传进来呀?哎,那怎么办呀,我在这儿再定一个行参,我叫什么呢?哎,我叫做一个name啊,定一个行参叫做name name干嘛呢?我这就不是点name等于孙悟空了,我直接让sf.name等于name啊,直接让cf.name等于name,那这样我这个name是不是就一个变量了?哎,我把一个变量赋制给一个属性,那这样的效果就是你传什么我就附什么,对吧,你传什么我就付什么好怎么办。
27:02
那我去哪传呀,去传呀,哎注意了,我们调用类创建我们这个什么呢?创建对象时调用类我们创建对象时,现在我调用一个person,是不是在创建对象啊,哎调用类创建对象时,你看这类后边是不是可以跟参数,哎类后边可以跟参数,那注意了,哎类后边的这个所有参数。哎,都会依次什么呢?哎,依次。传递到我们个什么呀?哎,Need中啊,传递到我们这个need中,所以注意现在你来看这我现在是不是需要两个形态呀,Self,我们说了代表对象自己,这是他们自己传了呀,哎,但是name他自己没传吧,没传我们就需要手动传,怎么传?要注意了,我在这儿调了一个person啊,我先把它注了,我在这儿调了一个person,就跟我调音译是一样的,它就相当于我调音译呢,那你现在来看啊,当我加了一个name以后,你看这还能不能了啊,还行不行了,我这一保存一执行,咱们来看是不是报错了,你看告诉你音译呢,是不是丢了一个必须的这个位置参数name呀,没有传这个name少了一个必须的啊,少了一个必须的,为什么?因为我们说了,你调这个玩意儿就跟调in是一样的,Int里边需要两个参数,你就得传两个,Int里边需要十个参数,你就得传十个,它需要几个你就得传几个,懂这意思吧,所以现在注意,那我这就必须得传什么呀,传name那我传一个。
28:34
啊,比如说我在这里传一个什么呢?传一个孙悟空,孙悟空这一保存孙悟空就传进去了啊,孙悟空传进了,那现在就等于内幕属性是孙悟空,诶那同学说老师你这不写了一个参数,一个参数应该给self,诶注意了,Self是我们解析器自己传的,我们不用管,我们直接从第二开始往后传就OK了,第一个不用管,自动传的啊,自动传的,那现在我们来看看P1的name,我直接来一个p1.chello或者这样吧,我直接普一个p1.1个内,这一保存一直行,是不是孙悟空啊,来,我再来一个,我这来一个P2,你注意我P2里边不传名行不行,不传名行不行,不传名是不是也报错啊,这个名你必须得传,我这来谁呢?我这来一个猪八戒,猪八戒啊,那这时候我再来一个P2,点name这一保存,P2是谁?P2是不是猪八戒呀?哎,我再来一个P3,我传谁呢?传一个这个沙和尚,这个我来一个这个P4我传。
29:34
谁呢,传一个这个唐僧啊唐僧,然后我这分别打印P2诶P3。P4我这一保存,我这一执行是不是孙悟空,猪八戒,沙和尚还有唐僧就都有了,那现在我们P1的名字是孙悟空,P2的是猪八戒,P3的是啥合成P4是不是就唐僧啊,那现在我来调一下啊,那现在你来看我这来调一下这个P3.1个C哈,那这个时候他再说还说谁还说谁诶再说是不是。
30:09
就是沙和尚了,哎,就沙和尚,我这一执行是不是沙和尚,我来一个P4.chello,我这一保存走一个是不是大家好,我是唐僧啊,哎,我是唐僧,那这样我们这功能是不是就完成了,哎,功能就完成了,那注意了,我这里写的这个效果实际上跟我上边写的效果是是一样的,是一样的,都是创建一个对象,然后分别给每一个对象指定了什么呀,指定了内幕属性,但是那这种方式有什么好处,有什么好处?诶好处很明显,第一个这种方式我name写不写,他不管你,你爱写不写对吧,他不会报错,而这种方式你一旦不写name干嘛了,是报错了,哎报错了,那让我们这个程序更加的严谨,确保你这个里边必须有name,这是第一个特点,对吧?确保我们这个name属的一个存在,那第二个特点呢,是不是简化了,你这每创建一个对象就负个值,每创建一个对象负个值,你这一个属性还好,你要有十个属性,你是不是得复制十个值啊,那这样就很麻烦,对吧,很麻烦。
31:10
但是那这个呢,我所有的赋值操作是不是都写到int里边了,诶都写到我们这个类里边了,那这个我们就不用在每次创建对象的时候都去复制,是不是简化我们对象的一个创建呀,哎,简化我们对象的一个创建,那这样我们的对我们一个类的一个最标准的结构就已经干嘛了,诶就已经出来了啊,我们一个对象的一个类的一个最标准的结构就出来了,所以注意以后我们的结构都是这样的,这个流程给它记住了啊,给它流程给它记住了啊,来,我们来把这东西给它粘过来啊,CTRLC粘到我们笔记里边啊,粘到我们笔记里边粘过来啊,这是我们说的一个创建对象的一个流程啊,我把这个注释呢,先给它去掉啊。
32:05
这个流程给它记住了,然后在这儿我们再写一下什么呢?哎,我们一个这个类,类的一个这个基本结构啊基本结构那这个时候我们就可以写了啊,那这我们来写一个,首先是一个class class后边跟的是一个类名,类名后边括号我们这都是可选的啊是我们的一个什么呢?哎,是我们一个叫做一个负类啊负类的事儿我们大再说你要知道你如果没有括号都可以不写啊,括号都不写,然后冒号,冒号后边我们之前简写是不是代码块啊,哎代码块,然后这里边我们说了可以写什么呀?哎,可以写叫做什么呀?哎公共的属性,哎公共的一个属性啊,公共属性你可以写多个啊,你可以写多个形式什么呀?诶形式像什么呀?像什么A等于什么,B等于什么,C等于什么,对吧?公共的属性在这可以写,然后再往下写是什么呢?哎,我们定义一个什么呢?诶定义一个下划线,下划线in itt里边我们可以有这个什么呀,诶self啊self然后还可以有什么呀,别的参数啊,别的参数,然后这直接省略号,这in是干嘛的诶。
33:05
In是我们这个对象的初始化方法,这也是我们这个对的一个初始化方法啊方法,然后再往下进行,再往下进行,我们是不是可以写其他方法了,哎,其他的一些方法,哎其他的这个方法,那结构是什么呀?哎,DF哎,那比如说我就叫一个method啊me holdd啊OD method啊method method什么呢?METHOD1啊METHOD1,当然方法里边是不是也得传self呀,当然你也可以去传别的参数啊,我就省略不写了,这是我们这个方法,方法可以干嘛呀?哎,可以写多个啊,注意属性,可以写多个,方法干嘛呢?也可以写多个啊,也可以写多个,我可以是一个METHOD2,然后可以接着干嘛,往下省略是不是可以写多个,哎,可以写多个啊,那这个是我们一个类的一个基本结构,所以注意音译,它是一个必须的in,它用来干嘛,用来初始化我们的什么呀,对象当中的属性,我们都是通过这种方式来对这个对象的属性进行。
34:05
初始化了,还是强调一下int作用研究这种特殊方法,魔术方法研究,第一个什么时候调用,第二个有什么用,什么时候调用,对象创建完了以后立刻调用,自动调的,我们不用调。第二一个它是用来干嘛的,用来初始化我们对象当中的什么呀,属性的,在这里边我们可以对属性进行赋值啊,对我们对象的属性进行赋值,好处,第一个简单对吧,我不用每一次都赋值,我直接给他值,让他自己赋就完了,简单。第二一个还有什么,诶简单是一个,第二一个避免我们把属性,把一些必要的属性是不是忘了,你如果不传就直接给你报错了啊,报错了,这是这么一个东西啊,这么一个东西,好,那接下来呢,我们来。来一个练习吧,哎来一个练习,说这么多是吧,说一个练习,练习呢,我们来干嘛呢?哎,我们来自定义一个类啊尝试什么呢?哎,尝试自定义一个什么呢?哎,一个类一个什么呢?哎一个这个表示我们这个狗的类啊,表示狗的类,那这类名就知道了是吧?狗的类呢,就是什么呀,就是道的啊注意类名首字母大写啊,我们用的是大驼峰命语法啊,首字母是大写的啊狗的类,那狗的类里边应该有什么?哎,那狗的类那首先一说定义类,一说定义类就考虑这两个有哪些属性,有哪些什么呀,方法把这东西考虑明白了啊,那我们想想狗的类里边有什么属性,有什么属性,有什么有这个name对吧?狗的名字还有什么呀,狗的这个年龄对吧?狗的年龄,那如果其实这两个在还还有什么呀,狗沾对吧,狗有性别是吧,姓名年龄啊,还有这个沾,那狗还有什么呀。
35:45
还有什么呀,还有什么身高是吧,身高比如说来一个这个he he he hi,诶那我们这来一个省略号,这个是我们说的,你可以代写是吧,你可以对,比如说你对狗比较了解,你可以把这个什么呀,诶属性多写点啊,属性可以多写点啊,这是一个属性,那注意了,我这写了四个属性。
36:05
那我既然有了四个属性,那这个时候我在阴里,我在整的时候还是不是只有一个name,哎,不是了,那注意了,你有几个属性,你这阴的和是跟几个值啊,诶你有四个属性你就跟四个值,你有五个属性你就得跟五个值,当然不算这个self self是必须的,对吧?Self是必须的,所以这个时候你要考虑清楚,这个时候你要传几个值啊,几个值,当然你越多,Int里边的参数就越多啊,然后方法那勾。有哪些方法呀?哎,狗有哪些方法,狗能有什么呀,有这个。有叫唤对吧,狗可以这个汪汪叫啊,狗可以汪汪叫,这个叫怎么说呀?哎,我们就这样吧,叫我也英文我也不会写是吧,我就直接写这个拼音了,方法一个叫做什么呀,那叫叫那就叫是吧,哎,叫诶然后还有什么呀,还有什么呢?还有咬它是不是可以可以咬你啊还有什么呢?诶这个我会解,还可以什么呀,还可以run,可以干嘛呀,可以跑啊,可以跑,那这个还是省略号,我们现在就暂时想到这三个方法啊,你可以来定义这么三个方法啊,一个是叫,一个是咬,还有一个是跑,当然这里边我没写啊,既然是方法里边都有什么,都得有这个self啊,都有self,那你怎么去实现这个方法啊,那咬咱们简单一点,你就诶咬叫我就狗汪汪汪是吧,你要咬我就狗狗咬你是吧,就打印一个狗咬你跑呢,我就打印一个狗去跑就OK了啊,这里这方法都比较简单,你就直接打印跑,诶叫咬就OK了啊就OK了,好,那自己来尝试定义一下这个类,那定一下这个类以后我们定义类大体。
37:38
你格式都是这样的,那当然我们还会要添加一些东西,但是这几个东西都是必备的啊,都是必备的,你在写这个类的时候一定注意,创建完了类再尝试,干嘛再通过这个类来创建几个什么呀,几个对象,几个对象再思考一下我的这种方式有没有什么不足的地方,哎,有没有什么不足的地方?好,这里我们来停一下。
我来说两句