00:00
好,我们接着来看啊,那刚才呢,我们已经定义了一个简易的类啊,它也不算是一个非常标准的类,就是一个非常非常简单的,里边有两个,有了一个属性name,还有一个方法叫做say hello啊say hello,那通过图中我们体现来看的话,其实name和say hello他们都存在于person这个类对象中,对吧?存在于类对象中,它有没有存在于P1还有P2这两个对象中啊,诶很明显P1和P202是没有的,通过这个图你是不是就可以看出来了,诶name在这个person里c hello也在person里,那这里边我们看的结果是确实我通过,哎,咱们这样啊,我打印一下,我这儿打印一个什么呢?打印一个p1.1个name,然后这再来一个p2.1个name,这一保存,我们一执行,是不是两个都可以访问到这个内幕属性啊,哎,也就是说这个方法,还有这个属性,它实际上都存在。
01:01
对于我们的类对象中,但是我们确确实实能通过这个东西叫什么,是不是叫实例啊,诶instance确实能通过实例去访问到,那这里边我们就要说一个问题,说一个什么问题呢?哎,我们说的这个类,或者说我们这个实例实例,诶为什么哎能访问到我们这个类中的什么呀?哎类中的属性和方法啊,类中的属性和方法,那这里边我们还是先给一个结论,一定注意啊,一定注意我们什么呀?哎,我们这个类中,哎定义的这个什么呢?定义的这个属性和方法都是公共的,都是公共的。哎,任何什么呀,任何该类实例,哎都可以访问,也就说什么呀,哎,我们在这个person这个类,诶里边定义的这些法属性和方法,它是公共的,只要你是person类的实例,只要你是通过person创建的这些你都可以访问,先把这个结论记住了,后边我们再说才有意义,你先把结论记住了,那接下来我们要说的是为什么啊,为什么那这要说一下什么呢?哎,说一下我们这个属性查找的一个流程啊,属性查找一个流程,哎,属性和我们这个方法查找的一个流程,那这个是一样的啊,说属性的,说方法是一样的啊,因为其实方法也就是一个属性,只不过它的属性值是什么呀?是一个函数啊,属性值是一个函数,那这里边我们就拿属性为例,哎,当我们哎调用一个这个对象的什么呢?哎,一个对象的属性时,啊,我先写完了,当我们去调用一个对象的属性时。
02:52
我们它会什么呢?哎,我们解析器吧,哎解析器会先在,诶会先在我们这个当前对象中寻找是否含有该属性啊,含有该属性会在当前对象中含有呃寻找是否含有该属性,如果有啊,如果有则直接返回我们当前对象的什么呀?哎,当前对象的一个属性值啊,直接返回我们当前对象的属性值如果什么呢?如果没有啊,如果没有则去我们这个当前对象的什么呢的类对象中去寻找啊寻找如果什么呢?诶如果有则什么呢?则返回类对象的什么呀,属性值啊,类对象的属性值那什么呢?诶类对项的属性值那如果什么呢?哎,如果没有则什么呀,则报错,那如果没有则报错什么意思看。
03:52
这了啊,这个东西其实非常理解,在这儿我写一个P一点name p一点name,那现在我是不是在访问P1的name属性啊,诶P内幕属性,访问P1就是访问这个对象的内幕属性,那这个对象里边有没有内幕属性,很明显Y6里边是空的对吧?Y6里边是空的,它并没有这个内幕属性啊,并没有这个内幕属性,所以他此时没有,没有是不是就不找了,不是这儿没有干嘛再去上一层,上一层是谁?上一层就是它的类对象,也就是说它type对应的那个对象,去这个对象当中去寻找,那这个type是不是就是person对象啊,Person对象是不是在这儿呢?那我问你了,Person对象里有没有name属性,有name幕属性,所以返回的是它的name幕属性,所以注意,当这个里边没有name幕的时候,它实际上找的是name里边的name,同样这里边没有say hello,是不是找的是name里边这个P里边的say hello啊,那PR是不是也是同理啊,它里边也没有name,也没有c hello。
04:53
Hello,所以你P2点内p2.chello的时候,实际上都是找的那里边的name,那里边的c hello,哎,那换句话说,那如果我这么做呢,如果我这么做啊,看着我这块我先给他住了啊c hello,我先不掉了,我这来一什么呢?诶p1.name等于一个猪八戒,那注意我在这儿干嘛,我是不是在为我们这什么呢?哎,修改P1的什么呢?P1的内幕属性啊修改P的内幕属性,那注意了,这个时候我p.name等于猪八戒,那现在如果在图中体现是什么样的?那这来写啊,我来写一个p1.name等于一个猪8G,那注意了啊,这个时候我是不是在修改P的内属性,P有没有内幕属性,没有没有,实际上它会自动给这干嘛呀?诶添加一个name等于猪八戒,那这个时候注意我再去访问p.name这个时候。
05:53
返回的是孙悟空还是猪八戒,哎,相信那相信你一定猜到了,一定是谁,一定是猪八戒,为什么?因为我们说了先找自己,自己没有是不是才找他的类对象的,那他自己有没有啊,有还找不着类了,哎,就不找类了,所以P1的肯定是猪八戒,我们来看看啊,我先直接打印P点那啊,一保存一执行,谁猪八戒啊猪八戒,所以这里面注意干嘛,先找什么自己啊,当前对象中寻找是否有该属性,如果有是不是直接返回该对象的属性了,他不会再去找了,但是如果没有是不是才会去找类类好,那现在问你啊,我这如果再打印谁的呢?我再打一个P2的,这是猪八戒,是孙悟空。
06:37
这猪八戒孙悟空这儿刚才我们这啊这儿写一个上边这是猪八戒,那这个是谁?哎,这个是孙悟空,因为什么?因为我在这儿仅仅修改了P1的,有没有改P2的啊,有没有改P2的,我们这一执行看P2是不是还是孙悟空,哎还是孙悟空,为什么?因为P2里边有没有内幕属性,哎没有内幕属性,所以它是不是依然会找这个类的呀?哎找这个类的,所以注意我们这个类里面保存的属性都是什么,公共的方法也都是什么呀,也都是公共的,任何该类实例都可以访问,那问题来了,也就是说我们会发现类里边也可以存属性,是不是我们的,哎也就说什么呀,类和类和我们的这个对象,诶类对象咱们这样分两类啊,类对象和我们这个实例对象中都可以保存属性啊,属性括弧方法也是对吧,方法也是,那问题就来了,那到底什么时候我应该。
07:37
把这个属性存到类里,什么时候应该把这个属性存到方法里头,什么时候?诶把这属性存到对象里,就是实例对象里,什么时候存到类对象,什么时候存到实例对项里,哎,那么多了,如果这个属性啊,括号弧也可以是方法啊,是什么呢?是我们这个所有的实例当中,实例当中所有的实例共享的,共享的什么意思啊,也就是说这个东西在我A对象里一样,在B对象里一样,在C对象里一样,只要是该类实例,它们的值都是一样的啊,所有实例共享的,则应该将其保存到什么呢?我们这个类对象中啊,都一样,就保存到类对象中,如果什么呢?如果这个属性还是括弧,方法是什么呢?是我们这个诶类是我们这个某个实例独有的啊,独有的,比如说其实像我们这个内幕属性就不适合保存到这个类,为什么?
08:37
因为name每一个人的名字一不一样,不一定吧,大部分人的名字是不是都不一样,所以既然不一样,你就没有必要存到那里边,因为他本身就不一样,对吧?所以哎,如果这个属性方法是某个实例独有的,则应该什么呢?诶应该保存到什么呀?哎,我们这个实例对象中啊,实例对象中拿人举例子啊,拿人举例子,那比如说我们人我有名字,每个人都有名字,那每个人的名字不一样,那这个东西应不应该保存到类对象中,不应该每个有名字,有身高,有体重,有什么性别,有这个住址,这些是不是每个人都不一样啊,所以这些东西就不应该保存到类对象里,但是有一些东西人是一样的,什么人有眼睛,人有嘴,人有鼻子,这些是不是每个人都一样啊,那这些都一样的就可以仿仿保存到什么呀,保存到类对象中啊,保存到类对象中,那有没有什么一般的情况,那我们来说一下。
09:37
一般情况我们说了,我们对象里保存两个东西,一个是数据,还有一个是行为,数据是属性,行为是方法,对吧?因为方法是表示行为的,那我们说了人一般情况下,你说数据一不一样,不一样,你的视力多少,你的身高多少,你的体重多少,每个人都不一样,对吧?所以数据属性是不一样的,但是功能呢,哎,我们的行为,我们的方法是不是都一样啊,哎,你能蹦我也能蹦,只不过蹦的远近不一样,哎你能你能这个走,我也能走,你能跑我也能跑,这个行为是不是大体上是一样的呀?哎,大体上是一样的,所以我们来说一下,一般情况下,一般情况下我们这个什么呢?属性保存到什么呀?哎,保存到我们这个实例对象中啊,属性保存到实例象中,而什么呢?而我们这个方法需要什么呢?保存到我们这个,哎,叫做一个类对象中啊,属性保存到实例对中,方法保存到类对象中,所以像我这种写法,这个写法我们开发的时候。
10:37
就不推荐使用了,除非你真的确定每个人都一样,那这种方式就不推荐你去使用了啊,不推荐使用了,好,那接下来我们再看,那现在我们来看一下啊,那这个时候注意了,我现在P1的内幕是猪八戒,我们这样改一个啊,改一个猪八戒,然后呢,p2.1个内幕改成什么呢?改成一个,改成一个沙和尚啊,改成沙和尚,沙和尚沙沙和尚,那现在我来看你说我现在在打印P一个的name幕,跟P2NAME蒙还一不一样了,哎,我这一执行是不是不一样了,哎,猪八戒和沙和尚,那现在在图里体现出来就是应该是P1这有一个name等于猪八戒,P2这有一个name叫什么呀?叫沙和尚,那这个name还有没有用了,现在来说就没用,因为他们两个都有自己的name,是不是就不用他这个name了,哎,不用他这个内了,所以现在注意啊,P1是猪八戒,P2插和尚,那现在看着啊,我做这么一件事,我直接delete一个P2。
11:37
Delete谁呢?p2.name这是干嘛?诶这是删除我们这个P2的一个内幕属性,删除P2的内幕属性,那这个时候我问你屁二在访问他是谁,诶是不是还是我们这个孙悟空了,哎,孙悟空了,所以你这一删了以后,屁二里边又没了,没了以后又又找谁了,又找这个孙悟空了,对吧,又找了孙悟空了,好,那现在我们这个就是我们说的一个这个属性和方法,那这里我们再补充一个问题,我们刚才看到了方法里边有一个变量叫A,对吧?变量对A,这是我们说的一个行参,我们说了你在调方法的时候,我们的解析器默认就会给你传一个十参,所以你这至少定义一个,你至少定义一个,他一定会传这个,一定会传这个,那问题就来了,这是干嘛呢?
12:23
这是干嘛的,这是干嘛的,我们先不管啊,我们先不管,那现在我们来看一下我现在这个P1P2里边啊,那这个方法一般我们就定义到这个类里边就行了,因为方法一般都是一样的啊,一般都是一样的,那现在我们要说一个什么问题,现在我希望啊,我希望这个方法,哎这个C哈,这个方法C哈这个方法诶可以显示如下格式的数据,什么数据呢?诶我们这是不是刚才仅显示一个你好啊,我这显示一个你好,我是叉叉叉,诶我希望显示这么一个,那什么意思啊?哎,如果是什么呢?诶如果是,如果是P1调用的,哎如果是,哎这么写吧,我就不写它了,那如果什么呀?你看P1的内幕是抓八戒,P2的内幕是沙和尚,对吧?我希望什么呢?
13:23
啊,如果是P1掉的,我们这就显示一个你好,我是猪八戒,诶如果是P2掉的,我就显示一个你好,我是沙和尚,那其实你这一想非常简单对吧,你可以显示一个我是什么呀,我是猪八戒一保存咱们这一直行,哎这还没掉是吧?哎来我这我是猪八戒,我这直接来一个1.name,诶不是他啊应该是一个什么呀,p1.chello,这一保存我们这一执行是不是你好,我是猪八戒出来了,哎非常简单,但是问题来了,我这个血他是干嘛了,他是不是血死了,哎写死了,那我这如果我是让P2掉呢,P2掉呢,走你是不是我也是猪八戒,哎,也猪八戒,但是P2这是谁呀?哎,P2这写的是沙和尚对吧,沙和尚,那我们啊这当然这儿不行,我也得写到什么呀,我得写到他们下边调对吧,你写上边的还没改呢,但是效果现在是一样的啊,效果一样的,我现在希望p1.3 hello,这应该打印谁呀,这应该显示我是。
14:23
八。而这应该显示什么呢?这应该显示我是沙和尚,但是现在还没有达到这个目的啊,达到这个目的。那现在我想达到这个目的怎么办怎么办,那就意味着我这能不能写死了,我还能不能直接写猪八戒,直接写上和尚,不能,这是很明显说必须得是一个变量啊,哎,那这样我这直接来个百分之S,我先用一个字符串给他占上啊,我告诉你传一个字符串,但是字符串是啥,我这不确定,然后我直接写吧,直接写一个,比如说我这来一什么呢?哎,来一个这个猪八戒,猪八戒保存走,你这是不是猪八戒了,哎,我这换一个沙和尚,一保存走,你这是不是沙和尚了?哎但是还是那句话,这你这写啥是不是都是写死了,这能不能直接写个字面的,哎不能,很明显我们这应该传的是一个变量,那这个变量我怎么写呀,我怎么写呀?哎,我能不能直接写个name,哎,我试试啊,试试我直接写个name行不行?试一下易保存,我们来看一下易执行干嘛了,是不是报错了,人家告诉你name is not DeFine,也就说我这能不能访问name啊,不能。
15:35
所以注意啊,我们来说一下在我们的什么呢?在我们的方法中,哎,不能直接访问什么呀,哎,访问我们这个类中的一个属性,注意他看不到这个name啊,他看不到这个name,它这里边它实际上会全它这个他们没有一个作用域,它不会说像我们之前的B包会上这儿去找这个name,他看不到,你记住看不到就完了,那怎么办?那你现在如果想是P1,你这是不是应该写的是一个p1.name呀,哎,p1.name,那这时候我们来看效果一直行是我是猪八戒,如果这是P2,你这是不是应该就是一个p2.name,一直行,是不是p2.name,哎,那现在就能看到了,对吧?你打印P1就是P点内,打印P2就是P2点内,但是注意了有没有问题。
16:21
虽然这现在的确是一个变量,你写P1就是p1.m,你写P2就是p2.m,的确是一个变量,但是你这么一写是不是还是写死了,你这如果写的是P2,这永远都是沙和尚,你如果写的是P1,是不是永远都是猪八戒了?哎,你怎么写都写死了,所以这能不能写P1或者写P2?哎,不能,为什么,因为这个值是不定的,怎么不定?如果是p1.chello,你这应该是p.name因为P1的name是不是猪八戒呀?哎,如果你是p2.4 hello,你这应该就是p2.name,你是应该打印,你好,我是沙和尚呀,这里边能听懂吧,就是说谁掉就打印谁的名字,P1掉就打印P1的名字,P2调就打印P2的名字,那这到底应该是谁呀?
17:05
这到底应该是谁?那这应该就是谁掉的方法,这是不是应该就是谁呀?P1掉就是P1 p2掉就是P2,那问题来了,我怎么知道这个方法是谁掉的,我现在能不能知道这个方法是谁掉的?哎,肯定不能,为什么,因为我在这儿是在定义方法,我这儿仅仅是定义,那具体是谁掉的我能不能确定?哎,不能调得是在这个位置是不是才能确定啊,诶得是在这个位置才能确定,但是在这里的我在。定义的时候是没有办法确定的,对吧?那怎么办,那怎么办?哎,那注意了,在方法里,我们这儿是不是有一个参数啊,哎,参数那注意啊,哎方法每次被调用时,每次被调用时我们的什么呢?我们的解析器都会什么呢?诶自动来干嘛呢?诶传递第一个十材,诶第一个十材也就是说这个十参它传了,它都是什么呀?自动来传的啊,都是自动的,每次都会传啊,每次都会传,那这个13到底是谁啊,我把这个print去了,那在这儿啊是谁非常容易我们直接干嘛呢?Print一下是诶啊print,诶我们这一保存一执行,诶你来看它是谁,你再一看它打印的是什么呀,是一个对象对吧?什么对象是一个person对象,它是不是一个对象啊,不是一个对象,两个对象,为什么?是不是因为内存地址不一样啊,诶内存地址不一样,象,那这到底是谁呀,到底是谁呀,咱们来。
18:36
看一下,我这先看啊,我这现在是不是P在调c hello啊来我先调一下c hello,然后再print一下P,那注意我在c hello里边打印的是参数,诶我在外边是不是打印的是P1啊,那我们来看一下啊,一保存走一个诶干嘛。地址一样是不是同一个对象啊,来再看我这掉一个p2.chello,我这打印P2,我们这一保存走一个,诶地址是不是也是一样,也是同一个对象,诶你会发现这A是谁呀,这个A我如果是p1.chelloa是不是就是P1呀,如果是p2.chello是不是就是P2啊,哎,P2所以这里边注意我们的这个十参是谁,我们的第一个参数就是什么呢?哎,就是我们这个调用的什么呀?调用方法的对象本身,对象本身什么意思?哎,如果是P1调的,哎如果是P1掉了则什么呢?则B一个实参第一个参数诶就是我们这个P1这个对象,如果是P2掉的,哎,则什么呢?第一个参数就是我们这个P2这个对象,说白了谁掉这个参数就是。
19:55
谁诶就说什么呀,是调用方法的对象本身,调用方法的对象本身,所以注意这里边叫A不好,因为它是有意的,是代表调用对象的本身,所以一般情况下,哎一般我们都会将这个参数哎命名,为什么呢?哎命名为self。
20:22
叫做一个self self什么意思啊,自己啊,Self叫做一个自己,所以一般我们的方法的第一个行参,我们不叫A,肯定不叫A,都叫什么呢?叫做一个self啊,叫ex self self什么意思?自己,为什么叫自己?因为它表示的就是我们调用者本身,你用P1调它就是P1,你用P2调它就是P2,这个非常好理解,所以在这儿我这如果拿P1调selff就是P1,如果拿P2调SF就是什么呀?就是P2啊,Selff就是P2。所以现在我们来说,如果我想实现刚才那功能,我如果是p1.c哈,就显示P的内容,如果是p2.c哈诺就显示P2NAME,那我这应该写谁?哎,我这实际上应该写的是一个self啊,应该写的是一个self,为什么写selff?因为selff就表示调用者本身P1调selff就是P1 p2调CF就是P2,那现在来看我是不是分别用P1掉了c hello p2掉了c hello,哎,我们这一保存这一执行走一个是不是就P1调的时候就是你好,我是猪八戒,P2调的时候。
21:23
不就是你好,我是沙和尚,他就发生了一个变化啊,那这是一个self啊,这是一个self啊,懂这意思吧,哎,那这个需要去理解一下,每个语言里都会有这个东西啊,每个语言都会有这个东西,那这个名字是不是必须得叫self,不是刚才你看了,我叫A也行,叫B也行,叫C也行,但是我们习惯叫self啊,习惯叫self,所以你写的时候也全都写self,不要使用别的名字啊,不叫self,那这个self有点像什么呢?这个有点像这个这个这个这个我们,呃,有的时候我们去跟别人聊天。
22:01
是吧,有时候我们跟人聊天哎,或者跟别人这个什么呀,打赌是吧,比如说我们这个这个这个嗯。这个这个说说话是吧,比如说我说了,哎,谁从这路过,我就。我就给他100块钱啊,谁从我面前路过,诶一会儿谁从我面前第一个路过,我就给他100块钱,哎,那这个self其实有点相当于点谁,这个谁确不确定,不确定,只有他真的来的时候才能确定,我们这用用这个谁来代替什么,来代替第一个从我身边路过的这个人,对吧?而我用这个来代替谁,这个self它表示的就是调用方法的这个对象,谁调用这个self就是谁,在别的语言里边我们用什么呢?用这个this来表示,诶但是在我们这个Python里,我们可以自己指定,但是一般我们都会以这个self来命名啊,这个一定要记住了,所以现在就记住了,以后我们定义方法里边都指定一个第一个参数,至少有一个参数,你后边再有是别的,你你可以再指定,你可以指定啊,但是第一个参数必须得是self,还要注意它表示的谁表示的就是我们调用方法对象的。
23:11
调用方法的对象本身啊,好,那这个我们又解析了一下,我们这个name,还有这个,哎,这个这个属性,还有这个方法啊,属性还有方法,我们在这儿来评一下。
我来说两句