00:00
好,那刚刚呢,我们简单介绍了一下这个封装是吧,它有这么些优点,但是其实还有一个优点呢,在我们这个里边啊,它体现不出来啊,体现不出来,那这里边我们再来继续来说这封装啊,我们来创建一个新的文件啊,我们还是叫封装啊这一个零六,那还有什么优点呢?诶那这优点还是说的是我们这个,诶get还有S方法,那这个方法有哪些优点,那还是有一些情况下,我们创建一些特殊类,比如说我创建这样一个类啊,我们这直接写一个,诶class class,我们来一个什么呢?诶class我们叫做一个re,诶叫做一个什么呀,这个叫做一个矩形啊哎,叫做一个矩形这么一个意思,我们创建一个类来表示一个矩形啊,那这块我们直接来往下写一下,这块我还是写一个文档字符串,这个是什么呢?哎,这是一个表示我们这个矩形的一个类啊,表示矩形一个类,那既然。
01:00
保是矩形,那我们还是先来整我们这个叫做一个什么呀,诶整我们这个初始化的这个方法啊,我们这个模式方法叫int啊,我们直接来一个这个哎,Int,呃,那这个int这块我们要既然是矩形,那矩形里边是不是要有什么呀,要有这个宽,还有这个什么呀,哎长和宽,哎长和宽,或者说是宽和高,对吧,我们的这个矩形,那这里边我们就需要两个呃属性来表示这个东西,一个是我们这个外WDTH,还有一个叫做he,我们表示一个高,那在这里边我们同样对它进行一个赋值,Self,我们还是来一个hidden hidden一个这个wise,诶等于个这个wise,然后呢,这来一个这个self,哎点一个这个hidden一个什么呢?诶,Hidden一个这个head。哎,等于什么呢?等于个这个height,那现在我们就已经有了初这个这个初始化的方法,那当然我们这也可以干嘛呢?哎,你也既然是属性了,我们说了,那那种属性我们有的时候需要隐藏起来,那这个时候我们就需要干嘛呀,哎,给这两个东西是分别设置我们这个S方法,还有get方法呀,哎,我们在这来尝试设置一下,我们先来设置这个west啊,直接定义一个,我们叫做一什么呢?叫做一个get一个west,哎,Get一个west哎。
02:24
Get we获取我们这个宽度的方法啊,获取宽度那这个简单了,直接return一个这个self,点一个这个hidden,一个wise啊,然后再来一个什么呢?诶,再来一个get一个hat,哎,Get一个我们这个he he。Get he get he,这我们同样直接return一个这个self,点一个head,一个he啊,Head一个he,然后再往下写两个get方法有了,接下来我们是不是该写我们这个set方法了,对吧?定义一个,我们叫做一个set,一个we啊,Set一个we,那注意了,既然是set方法,我们就需要传一个参数,因为你要传一个新值进来啊,直接来一个wise,那这里边我们要写的是一个self,点一个这个黑的一个这个wise等于一个Y啊,Set一个wise啊,然后再往下写,我直接复制了啊,我们还需要一个什么呀,还需要一个set。
03:21
这是一个he he啊he这也是一个he,那同样这下边这是不是也是hidden的一个he,然后等于一个he这样一个对吧?那现在我们这个get方法就写全了,所以你会发现其实的确会稍微有点麻烦,如果你希望把这个数据给它藏起来,并且控制它的这种,哎,读取还要设置,你必须把这个get f方法都写全了啊写全了,那接下来我们来说,那还有什么优点,还有什么优点在我们的这个形里边其实还有一个属性,还有个属性什么我们矩形里边是不是有一个面积啊,哎,有一个面积啊,那这个面积注意了,面积这个东西我们需不需要设置,我问你一个矩形,一个长方形,那那面积我们需不需要设置,诶很明显面积我们是不需要设置的,为什么?因为一旦有了宽度和高度,实际上它的面积是不是就已经定了呀?哎,所以面积实际上是一个计算的属性,它是通过两个直。
04:21
计算得来的长乘以宽是不是计算得来的呀?哎,那这个时候你就需要干嘛了,哎,你如果说没有方法,没有get s的方法,那这个时候你这个计算属性能不能体现出来,哎,不能体现出来,你只能是手动的去计算,而且每一次修改wes你就要去更新,修改你也要去更新,但是现在我们有了这个get,那我比如说我现在就有一个这个什么呀,哎,有一个这个面积,那我怎么办呀,我直接定一个新的方法,我叫什么呢?叫做一个get,一个这个aar a EA,我们的一个面积,那这个方法很明显就是获取我们矩形面积的,那我就直接干嘛呀,Return一个什么呀,Self点一个黑的一个Y乘以一个self点一个这个黑的一个head,我直接返回这个,那这个时候你只要想你要想获取面积,是不是直接调这个get re就可以了,哎,GET2就可以了,那这时候我们再来看一下啊,直接写一个啊来一个R等于一个这个诶矩。
05:21
行,这个我们来什么呢?来来一个五,来一个二,也就说宽度是五,高度是二啊宽度是五,高度是二这么一个矩形,然后现在我想获取它的面积,那我可以直接点一个get re,这一保存,一直行是不是就是十啊,哎,就是十,因为是二乘以五得十嘛,好处在哪?那我现在来一个2.1个S,宽度变了,宽度变成十了,我们来看面积是不是自动变成20了,哎,宽度,诶我再来改一个高度,高度呢,2.1个S,一个he he来一个这个20的这一保存,诶我们面积是不是变成200了,也就说面积它总是可以自动去什么呀,自己去计算,所以在这封装,我们如果再加一个优点的话,还有什么呀?哎,我们使用这个get set方法干嘛呀?我们使用我们这个get get方法,哎,可以干嘛呢?哎,可以表示一些叫做一个计算的属性啊,计算的这个属性,也就说这个属性它不是原来就有的,而是什么呀,而是通过计算获取的。
06:21
那这个时候我们就可以通过get方法来完成了,如果没有get这块就会干嘛呀,相对来说要麻烦一些啊,相对来说麻烦一些好,那这个是我们说的一个它啊,简单又举了一下例子,说了一下它,然后把它住掉,住掉以后我们接着来说这个问题啊,说这个问题,那这块我们还是呢,把我们之前创建这个狗这个给它整过来,或者这样吧,我们来整一个人的,我们直接定一个新的class class我们叫做一个这个person啊PN表示我们这个人的啊人呢,还是我们这里边是需要一个我们这个这个叫做一个音译的方法呀,哎,音译的方法,那音译这里边我们直接来写一个人有什么呀,有name有什么呀,有age,我们就先写这两个吧,其实你会发现人的属性跟狗的是一样的,对吧,一样的,之前我们是怎么写的,之前我们是写了一个这个self,点一个hidden hi音hidden name等于name对吧,我们就写一个name吧,简单点,然后在这我们是不是需要给这个name提供方法呀?
07:21
哎,提供get和set方法,但是这里边啊,我们写上吧,我直接复制一个,嗯,狗的这个get name,还有这个set name,我直接粘过来,其实他们都是一样的,对吧?诶get name和set内方法我们给它提供好了,也就是说你如果现在再想去设置name,你是不是只需要去调这个get name和set name就OK了,哎,Get name和set name就OK了,但是这个时候注意了,它会有一个这个一个问题,什么问题呢?我们先创建一个啊,直接来一个P,等于一个这个person person呢,我们这来等于一个这个孙悟空,现在我就创建了一个是孙悟空了,那这个时候我们来干嘛呢?我来打印一下的名字,直接来一个P,点一个get name,直接一保存一执行,Name是不是就是孙悟空啊,来孙悟空,你要想改,你在这也可以改,你直接来一个P点,一个这个site name set name呢,我们来一个这个猪八戒,猪八戒一保存,现在打印出去猪八戒了,诶给也可以改了,但是现在我虽然是用的这个hidden name,但是你会发现其实还会有。
08:21
一个问题,这个它是一个什么,这个东西是不是说外部绝对不能访问的,哎,明显不是,就是说在这儿如果你再写一个P点,一个什么呢?黑的name,黑的name等于一个猪八戒,也就说这个时候你还是可以直接去改,是不是也变成猪八戒了,或者我再改一个,我改成沙和尚,因为刚才就改的猪八戒啊,沙和尚一保存走,你是不是还可以改啊,哎,还可以改,也就是说现在我们这种封装的方式,我们这种隐藏的属性的方式,我们说了就是非常简单的,干嘛呢?在属性前边加了一个黑的来表示它是隐藏的,但是实际上外部是不是依然可以访问啊,哎,依然可以访问,那有一些情况下,我希望把我这东西隐藏的更彻底,不让外部直接去访问,也就是说我希望这个东西外部访不到,那怎么办呢?哎,那注意了,我们这来说一下,哎,在这我们来说一下,哎,我们可以什么呢?可以为我们这个对象的属性添加什么呢?诶使用。
09:21
我们这个,哎,双下划线开头,哎,双下划线开头什么意思,就是下划线,下划线叉叉,叉叉后边是跟着你的什么呀,属性名啊属性名,那我们说双下划线开头的属性。双下划线开头的属性是什么呢?是我们这个对象的一个隐藏属性,就是什么呢?诶在我们这个外部,诶也就说隐藏属性,哎只能在我们这个什么呀,哎类的这个内部访问无法什么呀,哎无法通过我们这个对象访问啊,无法通过对象访问,这是我们说一个隐藏属性,也就是说它这个双双上牙线的方式,其实本质上也是给我们属性改了一个名,但是不同的是这种改名方式是我们拍的内部支持的,你说你这种改名以后,改完了以后,他就外部就反应不了了啊什么意思,看这啊,现在是不是写的黑的name呀,哎我改了,我改成双下划线一个name,但你这光改不行,你得把这干嘛呀,也得改了,哎也改成双下划线内,这也改成双下滑内内,那注意了,我这写一个双下划线,在我内部是可以访问的,咱们先看效果啊,我先不改啊,我先不改这一保存我这一执行。
10:38
孙悟空是不是没问题啊,诶没问题,但是注意了,看着我现在这不打印该name了,我这直接打印什么呢?P点一个双下划线一个name,这一保存还能不能访问了,告诉你person object has no attribute这个玩意儿没有,诶不对呀,我这明显是有啊,但是这访问不到啊,哎,为什么,就是因为它是一个什么呀,隐藏属性啊,就是因为一个一个,它是一个隐藏属性,他不让你在外部去看到啊,不让你在外部看到,那同样我既然读都读不到了,我能不能改啊?哎,我直接来一个P点一个下划线name等于一个这个猪八戒读都读不到,你改干嘛?改是改了,但是有没有生效啊,哎,没有生效,因为它没有去动到我们这个里边那个东西啊,所以注意我们来说一下双下划线开头的属性,诶它是什么呀?是隐藏属性,诶是隐藏属性无法。
11:38
通过我们这个对象访问啊,无法通过我们这个对对对象访问,这1.1定要注意啊,是我们说的双刷下划线开头这个属性好,那这一块看完了,那我们接着来看啊,接着来说一下,诶他注意了,其实我说是隐藏属性注意了,其实这是一个假隐藏啊假隐藏,但是我们这儿来说一下,其实啊有一个小秘密是吧,我要告诉你,其实哎隐藏属性,隐藏属性只不过是我们这个什么呀,Python给他什么呀,哎自动哎为我们这个属性改了一个名字,所以注意啊,虽然我们这是叫下划线内部,但是实际上Python内部它自动给它改了一个名,它怎么改的呢?它实际上什么呢?呃,实际上是将我们这个呃名字修改为什么呢?诶修改为了叫做一个什么呀?诶,下划线这是一个类名,然后下划线你的什么呀,属性名,所以。
12:38
当你这写了一个下划线下划线name这个东西实际上是干嘛了,诶,比如我们的这个下划线下划线name实际上是干它改成了叫什么呢?叫做一个下划线percent下划线下划线name,哎,就是说他实际上把这边改成这个了,也就是说我在这儿来咱们看啊,我直接打印一个print,一个P点,一个下划线,叫做一个这个person下划线下划线内,这回我们来看看能不能访问,一执行是不是也可以访问啊,哎,我再来看看我能不能改。
13:08
哎,等于一个这个猪八戒一保存走,你是不是也改了呀,哎,也可以改啊,所以这里边注意所谓的这个隐藏属性,实际上它是一个伪隐藏,是一个假的,只不过它怎么做的,就是你写一个下划线,下划线内它的内部干嘛呀,把这名改成这个了啊,你写它就相当于什么呀,写它它给你自动做了一个什么呀,改名,所以本质上跟我们写那个hidden是一样的,只不过那个hidden是什么,是我们自己起的,而这个名字是不是Python自己起的,Python去起的啊,所以本质上也没有真正的去隐藏起来,诶只不过呢,就是他没有那么直观,那实际上也是跟改名是一样的,所以这种方式吧,哎,有同学可能会说了,老师那这个隐藏不隐藏它有什么意义啊,诶,确实如果从这个角度来讲,你即使设置了隐藏,他依然可以访问,的确没有什么太大的意义,但是他就是什么呀,我们还是那句话叫什么呀,防君子不防小人。也就是说我告诉你,我。
14:09
那么设置就是给你改名提供改我这个属性增加一些障碍,我告诉你这个东西我不希望你去改,但是我不可能去完全限制你去改,因为我如果完全限制你,我这个程序的灵活性干嘛了,就下降了啊,就下降了,所以这块即使你用了双下划线依然可以改啊,当然同理啊,你给函,你给函数,这加双向给方法,这加双线也是一个道理啊,也是一个道理,那这里边,所以其实这种方式我们其实是不太推荐你用的,因为用了跟没用是一样的,对吧,用跟没用一样的,所以一般我们会怎么用,我们说一下我们推荐方式啊,这一块我都注掉这粘过来。哎,咱们这里边注意啊,我们说一下我们使用这个双下划线开头的这个属性,也就是说实际上,诶实际上依然可以在什么,诶在外部访问啊,在外部访们所以什么呢?所以这种方式不什么呀,哎,我们一般不用啊,一般不用,但是不不绝对啊不绝对,因为你写了跟没写一样,对吧,他想访问也是可以访问的,所以一般是不用的,那怎么办?所以一般什么呢?诶一般我们会将一些什么呀,一些私有属性,什么叫私有属性就是什么呀,诶不希望被我们这个外部访问的属性啊,访问的属性以什么呢?诶以这个下划线开头,所以这种情况我们一般就是什么呀,哎,你像这种name我们也不写head head name黑内太麻烦了,我一般都是什么呀,就写个下划线name,这也是写一个下划线name,这也写一个下划线name,就说我只会在属性前边加一个下划线,而不是加两个。
15:52
那注意这有什么区别,你加一个下划线,它并不是一个隐藏属性,也就是说在这儿它是可以访问的,我们来看一下啊,我们直接来把这粘过来。
16:05
然后在这我们直接print一个P点,一个下划线内这一保存走一个是不是依然可以访问呀,并且也可以去修改啊,也可以修改,那这样什么目的,首先我写一个下划线比我写两个下划线要简单,对吧?写一个下划线比我写两个下划线要简单,那第二一个我们使用两个下划线,虽然名义上叫做隐藏属性,名义上叫做隐藏属性,但是实际上它是不是依然可以访问呀,诶依然可以访问,但是访问起来是不是比较麻烦呀?诶比较麻烦,那既然也可以访问,只是增加了它复杂性,那我干脆干嘛呀,我就加上一个下划线就完事了,那我这访问起来是不是还比较简单一点啊,但是我这个属性跟别的属性又不一样,为什么?因为我这个属性前边多了一个下划线,多一个下划线的目的什么,告诉你这个属性我不希望你改,但是你还是可以改,我只是什么呀,不建议,那至于要不要改,你自己来什么呀,自己来决定啊,自己来决定,所以注意一般什么呢?哎,一般情况下我们。
17:05
跟这个什么呀,诶使用这个下划线开头的这个属性,诶都是私有属性啊,都是私有属性,没有什么呢,没有特殊需求,没有特殊需要不要干嘛呀,哎,不要修改我们这个私有属性,也就是说我这个下划线就是一个标志,我告诉你这是一个私有的,我不需要你改,但是你要改那你随便,但是我告诉你了,我不需要你改,全靠自觉对吧,全靠自觉,所以我们一般都会使用什么呀,单下划线,像这种双下划线的相对来说会用的比较少,但是你要知道,如果有双下双下划线的属性,你要想访问怎么访问,前边加一个下划线,后边跟的是什么呀?类名你叫do就写do,你叫person就写person,你叫什么类你就写什么名就OK了,后边是你那个真正的那个属性名就OK了啊好,那这个是我们说的一个这个隐藏我们这个属性啊,我们这里边儿还是来停一下。
我来说两句