00:00
接下来呢,我们来说我们面向对象的另一个特征,我们之前说过了面向对象三大特征对吧?哎之前说过了什么封装说获了继承那三大特征,还有一个我们来说一下,保存一下,我们来创建一个,我们要说一下这个多肽,哎多肽呢,不是说你有很多个太太对吧?哎多肽哎是这个形态的态,呃,多肽是我们这个什么呀,也是我们这个面向对象的这个,诶三大特征之一啊,也是我们这个面向对象的三大特征之一,那什么叫多肽啊,多肽多肽呢?哎,从我们这个字面上理解。哎,是什么呀?哎是就是多种形态啊,多种形态哎比如说我们说狗,哎狗狗是一个很大的类类别对吧?哎狗很大的类别,但是狗具体它是不是有狗的品种啊,哎有什么呀?哎有狼狗有什么呀?哎有这个藏獒,哎藏獒有什么,这个哈士奇是吧?哎还有什么呀?哎还有等等吧,是吧,我就是什么什么古墓是吧?哎古墓古代牧羊犬对吧?哎等等等等,也就是说狗它是一个大的品种,但是在这个狗的品种,狗的这个大的分类下,是不是有很多这个具体细节的分类啊,哎那们说了,狼狗也是狗,那狼狗就是狗的一种形态,那藏獒也是狗,那藏獒也是狗的一种形态,哈士奇也是狗,哈士奇是不是也是狗的一种形态,也就是说我一个对象可以有什么呀,不同的形态去呈现啊,一个对象可以什么呢。
01:44
可以不同的形态去呈现,诶一个对象,诶可以以这个诶不同的这个形态去呈现啊,去呈现,那这个是什么意思,这个是什么意思,那注意了,其实多肽非常简单,但是由于它太简单了,所以有的时候就不太好理解,那怎么办?那我们先来整一个东西来演示一下,那现在呢,我这来定义两个类,哎定义两个类,两个类是什么呢?哎,一个是A,还有一个是B啊,我直接来一个class,一个A啊class a,然后呢,我们这不写继承了,因为就让它默认是object啊,然后在这我们直接定义一个,诶DeFine,我们来一个这个in it。
02:28
哎,In int呢,这儿我们来一个这个属性,我们就叫一个name,在这儿我直接来一个self,点一个下划线,Name等于name,那既然有name了,在这我们来给它整一个什么呀?哎,整一个这个sat啊,我们就叫一个name啊,这get是吧,然后再整一个。再整一个,我们来一个这个name,点一个C,呃,Center呢,直接定义一个这个name name里边我们来一个这个self,这再来一个这个name,我们直接给它进行什么呀?诶直接给它进行赋值,这就不用给它写空格啊,直接给它对它进行赋值,这是我们的类,然后再来一个我们这儿直接再来复制了啊复制了哎我再来什么呢?哎,来一个这个类B,诶类B,但是现在A和B里边都有这个内幕属性,对吧,内幕属性那我们正常来讲啊,现在A和B是一模一样的,但是我们说实际情况下可能是A可能还有age,还有沾nder,那B可能还有address,还有一些其他属性,但是现在我们就体现出它相同的部分,不同的部分我们就不点出来了,但是你要注意它是两个类,两个类有一个共同特点,里边都有什么,都有内幕属性啊,都有内幕属性,那这个时候我就可以干嘛呢?诶创建一个A的实例,A等于一个这个,AA里边我直接来一个这个。
03:48
孙悟空A的name叫孙悟空,然后这儿来一个B等于一个这个BB,里边我们来一个这个猪八戒,哎,两个对象对吧?两个对象创建完了,那怎么就体现出多态了呢?那现在啊,在这儿我来定一个函数,定义一个函数,直接来一个,来一什么呢?哎,我们叫做一个c hello c hello函数,顾名思义它是不是可以说好,说你好对吧?诶说你好它需要一个参数,比如说我们就叫一个obj作为参数,那作用就是直接print的一个你好,然后这来一个百分之S,这直接干嘛呢?哎,百分之我们来一个OB接点内,诶什么意思?那这个时候就是我们这写了一个say hello,就表示说你给我传进一个对象,我就干嘛呢?像你这个对象说你好,哎,那你这个对象的名是孙悟空,那我就说你好,孙悟空,你这个对象名是猪八戒,我就说你好,是猪八戒,那注意了,这里我们现在想调say hello say hello,是不是需要一个参数啊,那问你这。
04:48
这个参数我传A行不行,传A行不行,哎传A我们这一执行诶。这块报了一个错,A这个冒号写错了,那A这个错了,B这肯定也得错,因为刚才是复制的啊,所以这块都给它改一下,一保存这一执行。
05:07
Self name啊,这又忘写冒号了,对吧?这有个冒号忘写了啊,太粗心了啊,太粗心了,我们重新看一下关闭,现在还是啊,我直接掉了一个c hello这个,诶这一执行走你是不是就是你好孙悟空啊,诶你好孙悟空,那现在注意我这再掉一个say hello这个B,那注意行不行,我这个可以将A这个实例作为参数,A是A类对象,B是B类对象,对吧?我可以将A作为参数,那问你我能不能将B作为参数,诶我们来一保存走一个一执行是不是?你好猪八戒诶,你好猪八戒,所以对于我们这个c hello函数来说,你可以拿A类的实力作为参数,也可以拿B类的实例作为参数,是不是都行啊?那我问你,如果我有一个C类能不能作为参数传进去,能不能作为参数传进去,诶,那我看了,我写一个C类,直接来一个class,一个CC,我们这直接pass,那好我问你C,我能不能作为参数传进去,能不能哎。
06:07
咱们试试不就完了吗?我们这来一个CC行不行,我这一执行干嘛了,报错了,为什么告诉你c object没有这个属性name啊,没有name属性C不行,那为什么C不行,很明显,因为C里边没有什么呀,诶没有name,所以这里边我们就看到了怎么叫多肽了,现在我们这个c hello接收一个OB接一个对象作业参数,那这个对象有什么要求?有什么要求那都意了,我们来说一下,对于我们这个c hello这个函数来说,C hello这个函数来说,只要我们这个对象中含有什么呢?含有内幕属性,它就什么呢?诶,它就可以作为我们的什么,哎,作为参数传递啊,只要对象中有内幕属性,我们这个它就可以作为什么呀,哎,作为参数传递,它有没有去考虑我们这个对象的类型啊,哎,所以这个什么呢?这个函数它并不会虑我们的什么呀,对象的类型只要有name么属性即可,也就说你传A也行,传B也行,传C也行,传B也行,它是什么类型不重要,只要对象中有什么,只要对象当中有内幕属性。
07:28
就可以,那这个就是一个什么,就是一个多肽,这是一个非常典型的体现,就说obj到底是什么对象,Obj是个参数,对吧?它到底是什么对象,可以是A类型对象,也可以是B类型对象,也可以是C类形象,是哪个类型对象都行,那这就是一个多态,但是它得有一个共同特点,什么特点你得有内幕属性,也就是说只要你有内幕属性,是不是就可以作为参数传进来,哎,这就是一个多肽啊,这就是一个多肽,听到这儿你可能会有一些感觉,大概会理解了,就说我这个参数,它可以是不同类型的对象,对吧?只要内幕属性你都可以往里传,只要有内幕属性你都可以往里传,但是它有什么好处呢?它有什么好处呢?好处现在你可能感受不到,但是现在我们来看。
08:18
我们来做一个没有用到多态的函数啊,怎么就没有用到多态了,看这我现在啊,在这我做一个类型检查,我复制一下啊,我复制一下,嗯,我们这来一个say hello2第二个版本的say hello,那在这儿呢,我我这时候变一个方式,我在打印的时候呢,我先做一个什么呢?做一个类型检查,怎么检查,直接来一个if,一个instance obj,然后什么呢?我们来一个A,我先来检查OB接是不是A的实例,如果OB接是A的实例,我才打印,否则我就什么都不做啊,我就什么都不做,那这个时候我们来看一下效果,我们直接调一下我们这个say hello这个二,我这时候还是先传一个A,我这一执行,你好,孙悟空,这是没问题的,对吧,这是没问题的,那这个时候我再换一个BB行不行,B行不行,一直行,是不是没有任何反应,也就是说B是不行的。
09:18
为什么?因为我在这里做了一个什么呀,类型检查啊类型检查,那注意在c hello2中,C hello2中我们什么呢?哎,我们做了一个这个类型检查,也就是只有什么呢?Obj是我们这个A类型的这个对象使哎才可以什么呢?诶正常使用,正常使用哎其他类型的这个对象,哎都无法使用该函数啊都无法使用该函数,你传个C也好,传个B也好,传个D也好,你有什么属性,你有100个内幕属性也不能掉,因为在这儿我们做了一个类型检查,只有A才行啊只有A才行,那这个什么呢?这个方法,这个函数就什么呢?诶就违反了什么呢?违反了多态,为什么违反多态,因为这个时候OB接只有一种形态,就是什么,就是A,就是A类型,其他。
10:19
类型B类型也好,C类型也好,B类型也好,是不是都不行了,诶这就违反了多肽,那我们说了这有什么缺点吗?这有什么缺点呢?那注意了,诶违反了多态,违反了多态的函数,它只适用于什么呢?只适用于一种类型的这个对象,无法什么呢?诶无法处理其他类型对象。其他类型项这样什么呢?哎,这样导致,哎我们这个函数的什么呀?哎适应性干嘛呢?哎适应性非常的差啊,非常的差,什么意思,就说你现在这个c hello只适用于A类型的对象,如果这天呢,换了B类型的,我也想有一个c hello,那怎么办?那怎么办?那我还得创建一个B类型的c hello,如果C类型我也有c hello干嘛,我还得创建一个什么呀,C类型的c hello,那这样我就会需要创建很多很多的什么呀,Say hello,为什么?因为我要为每一种形态,每一种类型对象是不是都创建一个say hello,那我们想想这样做是不是会非常非常的麻烦呀,哎,非常非常的麻烦,而像这种c hello我用了多肽了,那你只要对象里有c hello,我是不是就可以用啊,诶,只要对象里有这个name属性,我就可以去用,而我不用去考虑你的这个什么呀,类型对象,所以当我用了动态以后,我们的这个。
11:46
致用性是不是就更高啊,诶,它可以应对不同类型的这个对象啊,不同类型的对象,而我们的没用多肽它干嘛呀,它有一个好的,它的健壮性更好,什么叫健壮性更好,它不容易出错,因为我做类型检查了,你类型不对,我这就不执行,它不容易出错,但是它的什么呀,通用性比较比较差,所以如果你不用多肽啊,那对不起,你这塞hello,你得写好多版本,诶A写一个版本,B写一个版本,C写一版本,B写版本,写一堆版本,但是如果我用了多肽以后,我写一个是不是所有的对象都可以用,哎,都可以用,这个就是我们说的多肽的一个体现啊,多肽一个体现,那这个时候注意了,多肽呢,我们有一句什么呀,哎,有一句名言,什么名言呢,我们来写一下啊,哎叫什么呢?多肽的时候,我们叫做用这个什么呀,用这个鸭子类型来举例子,鸭子类型来举例子,什么叫鸭子类型呢?哎,鸭子类型我们说了,哎如果它什么呢?如果。
12:42
哎,如果一个东西妈呀,哎,走路像鸭子,哎,叫声像鸭子,哎,那么哎,它就是鸭子啊,那么它就是鸭子,这就是我们多在一个最典型的描述,也就是说我们再去看一个对象的时候,尤其是我们作为程序员,我们在看一个对象的时候,我们其实主要考虑的不是它的类型。
13:15
它是A类型也好,它是B类型也好,我们不用考虑,因为这个类型实在是太多了,如果你每个种都考虑,我们这样就太麻烦了,所以我们只考虑什么,我们只考虑它的功能,它的属性的方法,诶如果你有内幕属性,你就可以调这个方法,如果你有这个方法,你就可以调用这函数,那我只考虑你什么,你具你是否具有某些特点,所以这个鸭子类型什么意思呢?诶那我你这个东西我怎么判断你是不是鸭子呀?诶我看你走路像鸭子,你的叫声也像鸭子,那你就是鸭子,你至于真正的这个物理世界里,你到底是不是鸭子,我不管,在我这儿我就认为你是鸭子,这个方法鸭子能用你就能用,懂这意思吗?这就是一个什么呀,多肽,多肽使我们的这个面向对象的编程更具什么呀,更具灵活性啊,更具灵活性,那其实这种情况我们用的是非常多的,举个例子,我们之前有个Le这个函数,哎,其实很多啊,Le这个函数它可以获取到我们的这个什么呀,哎,这个列表。
14:16
列表中元素的个数对吧?比如说我这有一个LL等于中号来一个这个123,现在里边有三个元素,那我要想获取它的长度怎么办?我直接print一个L,诶叫做一个L一个什么呀,L这一执行一保存,呃,Print printt易保存,我们来看是不是三呀,哎可以获取它长度,那同时呢,我们来一个S等于一个这个hello,易保存,那我能不能获取这个字符串的长度,诶易保存走一个是不是也可以获取字符串长度,诶也可以获取字符串长度,那这个时候注意,那这里是不是就是一个多态啊?诶L跟S很明显它不是一类型的,像一个是列表,一个是字符串,但是它们却都可以通过N来获取长度,那这是为什么啊,这是为什么?那注意了,诶之所以诶一个对象,哎,能通过这个棱来干嘛呢?哎来获取我们这个长。
15:16
是因为什么呀,对象中具有一个什么呀,哎,特殊方法。通说法叫什么呢?下划线,下划线。一个特殊方法,特殊方法叫什么?就叫做一个下划线论,下划线论都是因为有这么一个方法,你只要有这个方法就可以使用论获取程度,哎,换句话说,哎,只要对象中具有我们这个论这个。特殊方法或者叫魔术方法对吧?哎,特殊方法就可以通过我们这个棱来获取它的长度,什么意思,那现在来看啊,我们现在来看谁呢?看我们的这个BB里边现在有没有嫩,哎,没有嫩,没有嫩干嘛呢?我给它加一个直接定义一个啊定义一个,我们这叫做一个下划线,下划线一个这个,然后在这儿呢,既然是长度嘛,我这直接返回一个值,Return一个十。
16:21
那现在注意我B里边是不是就有论这个魔术方法了,那现在注意B的实力就都可以调用Le了,我们来看看效果,先把这住掉,这直接来一个这个print,我们来一个这个Li一个什么呢个B,诶B类型的对象,这一保存一执行是不是就是十啊,为什么它也能掉,楞就是因为它也具有了什么呀,哎,具有了这个论这个方法,那好我们再来看你说C能不能掉,C能不能掉,诶C我这一保存一执行干嘛了,是不是报错了,诶C不能掉,为什么不能掉,因为C里边是没有论那个魔法函数,哎,那我论那个特殊方法啊特殊方法,那这个就是我们说一个多肽的一个最好的一个什么呀体现,那就是说有了多肽以后,我们方法定义更加灵活,也就是说我的参数不用去考虑什么具体的这个类型,只需要干嘛,哎,只需要确保你符合某个特征,具有某个属性,具有某文化,只要你符合某个特征就可以作为参数传联。而我需要。
17:21
要去考虑类型,这就是一个什么呀,多肽啊,而我们Python里边动态是非常的彻底的啊,非常彻底的啊,所以这里边注意啊,我们刚才说了,像这个函数是不是就违反了多态啊,哎,违反了动态,所以注意注意哎,像我们这个is instance。It's in the tenth。诶,这种函数,诶在开发中,哎是什么呀?哎是绝对,哎一般是不会使用的,不会使用,为什么不会使用,因为你一旦用了instance instance就表示你是不是要检查一个对象的类型啊,你一旦去检查对象类型,就意味着你可能是违反了多态,所以这个时候干嘛就不要去使用它啊,就不要去使用它,所以这种像违反多态的代码是坚决不要去使用的啊,坚决不要使用的好,那这里边我们面向对象的三大特征我们就说完了,在这儿我们来总结一下面向对象的一个三大特征啊,三大特征哎哪三大特征一个是我们这个封装,还有一个我们叫做一个继承,还有个叫做什么呀,叫做一个多肽,就是这个三大特征,为我们面向对象这种语言保驾护航,所有面向对象语言都必须具有这三个特点啊,三个。
18:46
风险,那他们都有什么作用,具体内容我们就不不强强调了,之前都说过了,封装简单就理解就是把我们属性干嘛呀,藏到我们对象的内部,就说我想让你看的我让你看,不想让你看的你都看不见啊,封装继承呢,诶我们可以通过继承来对一个类进行扩展,进行增强,多肽呢,诶是不是让我们这个方法的定义更灵活呀,我不用去考虑你对象的具体类型,只要你满足我们的某种要求,就可以作为参数去传递,所以这三个分别给我们的面向对象的这种对象,它提供了一些东西,那封装干嘛呢?封装它确保了什么呢?呃,确保我们对象中的这个数据安全啊,数据安全保证了什么呀?你的对你的数据不会被随意的修改,诶不会,你不想让他看的,他就看不见,诶内部属性就看不见,对吧?诶确保了我们数据的一个对象中数据的安全,而继承呢?诶而继承保证了什么呢?保证了我们这个对象的一个什么。
19:46
呀,诶可扩展性,诶可扩展性也就是说我可以通过继承对一个类或者对这个对象进行什么呀扩展,我只需要去继承你,然后我在你的基础上去增加一些方法,再修改些方法,我是不是就对你进行扩展了,哎就可以干嘛了,确保我可以,诶遵守我那个OCP原则对吧?诶对这个增强,对这个修改干嘛,对这个什么呀?诶对这个这个诶增强扩展开放,而对这个修改干嘛呀?诶关闭啊,关闭继承保证了我们对象的一个可扩展性,而我们这个多肽呢?诶多肽保证了我们这个什么呀?诶我们这个程序的一个什么呀,灵活性啊,灵活性有了多态,你的程序更加灵活,因为我们这里面提到一个类型概念,如果我们的方法,我们的函数都和类型去绑定的话,这样会导致我们这个函数的通用性干嘛呀会很差,而有了多态以后,因为我们不用去考虑具体的类型,这样干嘛呀让我们的程序。
20:46
更加的灵活啊,更加灵活,那这个就是我们三大特征,封装,继承,多态,好好的去体会一下这个东西,体会明白了,面向对象你也就基本就懂了啊,基本就懂了,好,那这个是我们说的一个多肽,我们来听一下。
我来说两句