00:00
好,关于继承呢,我们还有最后一个,我们要说一下啊,呃,11我们叫做一个多重继承啊,多重继承这个听起来是一个很神奇的东西,对吧?很神奇的东西,那我们呢,先看这样一个例子吧,把我们之前这个写的这个ABC这个给它粘过来啊,ABC这个CTRLCCTRLV,呃,那现在呢,我们这个关系很明确对吧?哎,继承了ABC继承了哎,C继承了B啊,C继承B,那现在啊,我不让B继承A了,我让这个,哎A呢和B他们是一个什么呀?哎,A和B都继承这个object啊,都记成object,哎,那这个时候我们来看一下他们的关系,其实就很明确了,对吧,C里边我什么方法都不写了啊,什么方法不写了,那现在这个结构看一下一个类A,它里边一个方法叫做test啊,一个类二它里边的方法做一个test,二还有一个类C啊,它里边没有方法啊,C是继承BA,诶A和B都是继承object。
01:00
这么一个东西,那说它之前呢,我们先说一个隐藏属性啊,隐藏属性有一个隐藏属性我们叫什么呢?诶叫做双下划线,叫做一个BAS,叫做一个basis啊basis这个属性干嘛呢?诶这个属性可以用来获取我们当前类的什么呀?诶所有副类啊,当前类的所有副类对它是类名点一个basis,所以假如说你要想看C的所有副类,你直接干嘛呢?诶你直接print来什么呢?诶C点一个base。哎哎,注意啊,双下划线,前边双下划线,后边也是双下划线。这一保存,我们这一执行,它是不是我返回这么一个东西啊,哎,返回这么一个东西,它返回的是什么玩意儿,返回什么玩意儿,诶你看返回的值,咱们直接看这吧,它是不是外边套了一括号啊,套了括号你要知道这是什么呀?哎,它返回的是一个元组啊,返回的是元组,然后这有一个逗号,是不是表示它里边就一个元素,哎就一个元素,那这个时候我也我也可以看什么呢?哎,我也可以看别的,比如说我想看看这个B的basis。
02:09
哎,直接是类名啊,注意类名大写的,我们这一保存,这一执行就一个谁啊,诶就一个object啊object,所以注意这个basic的作用很简单,就是来看我们当前类的什么呀,哎,负类啊负类,那这个时候就会有一个比较特别的地方,你需要注意一下了,这块写的是一个杯斯,比如说它是一个复数,并且它返回的元组也是一个什么,也是一个负数啊,也是一个返回的结果,是不是一个元素啊,那既然是元组,是不是就是放了多个元,多个元素啊,哎,多个元素,那多个元素难道说我们一个类里边可以有多个父类吗?哎,确实如此,所以才叫什么呀,多重继承啊多重继承来咱们来说一下,在我们这个Python中可以什么呢?诶,它是什么呀?它是支持我们这个多重继承的啊,多重技能也就是什么呢?诶,也就是我们可以为一个类。
03:10
哎,一个类同时指定什么呀?哎,多个浮类啊,指定多个副类,那注意了,这个特性在很多语言里都是不支持的,在Python里还比较得独特,他可以支持什么呀?诶多重继承说白了,一个儿子可以有多个父亲啊,一个儿子可以有多个父亲,哎,那多重继承怎么办?那我们可以什么呢?哎,可以在我们这个类名的这个什么呀?哎括号后边干嘛呢?哎,添加什么呢?添加多个类,诶来实现什么呢?哎,来实现我们这个多重继承,哎多重继承,那这个时候我们这来一下,直接来一个B,我这来一个A,然后来一个逗号,来一个什么呢?来一个B,那这表什么意思?这表示我们C既继承了A,又继承了B,啊C既继承了A,又继承了B,那多重继承什么呢?哎,多重继承会什么呢?哎,会使我们这个子类诶庸。
04:10
拥有哎,同时拥有多个负类,并且什么呢?诶,并且会,哎获取到我们这个所有负类中的什么呀方法,也就是说现在我们的C它是既继承A又继承B,这个时候它既可以调A的方法,也可以调什么呀,调B的方法,那这个时候我们还是再打印一下C的一个basis啊打印一下C的basis,这一保存,我们这一执行走一个,那这个时候你会发现我C里边有几个父类了,哎,C里边是不是就有两个负类了,一个是A,还有一个是B,那这个man是什么,我们先不管它,后边我们再说,现在你要先看这个点后边行什么,哎,C既继承了A这个类,又继承B这个类,就是说C现在是什么?哎,是两个父亲啊,两个父亲,那这个东西如果我们用一个图来体现的话啊,我们来画一个简单的一个什么呢?哎,树形结构。
05:05
新建一个啊,新建一个数形结构,最上边的一个副类,我们应该是一个什么?哎,应该是一个object object,它是所有的副类啊,Object OB je object呢,它会有两个子类一个,诶两个子类一个是谁呢?诶,一个是我们的这个A啊,一个是我们这个A,还有一个谁呢?还有一个是我们这个B。哎,B,哎,然后呢,我们这来画个箭头啊,OBJECT2个子类,一个是A,当然object很多子类是吧?在这我们就画两个啊,一个是A,还有一个是B,然后在这呢,我们会有一个类叫做一个什么呢?哎,叫做一个C。哎,这个C干嘛呢,它同时是A还有什么呀?哎,B的这个子类。现在是不是这样一个关系,哎这样一个关系,那注意了还能不能有多个负类,哎,当然这里边注意不是只有两个,你后面还有D,还有E,还有F,你可以顺着往后写有几个都行,不限制你负类的数量,那这个时候我们来看一下,我直接调一下,我们来看看A里边有T1 B里边有A里边有TB里边有test的,二我们来看看能不能掉,C等于一个C括号,我们直接来一个C一个test,先看T1执行AA掉没掉,是不是掉了呀?诶执行了,然后我这再来一个C,点一个test,二这一保存一执行是不是也掉了,哎,也掉了,那这样就是什么呀?哎,它实际上是一个非常非常强大的功能,是C既有A的方法也有什么呀,B的方法就相当于什么,诶,认了一个干爹对吧,认领干爹同时继承了这两个父亲的一个什么呀,哎,父亲的方法啊,父亲方法,但是其实什么呀,哎,那注意了,在开发中呢,在开。
06:56
开发中我们什么呀,哎,没有特殊情况。
07:01
没有特殊的这个情况,哎应该干嘛呢?诶应该尽量避免使用我们这个多重继承,因为什么?诶因为多重继承会什么呀?诶多重多重继承的这个,诶相对来说干嘛呀,哎会让我们的这个代码过于什么呀,过于复杂,为什么复杂,本来你没有多重继承的话,我们想想。如果没有多重继承,我们是不是只涉及到一个重写的问题,子类去重写父类的方法,但是现在有了多重继承了,我们就会遇到这么一个问题。我在B里边也添加了一个test的方法,B中的这个test方法,那现在这个情况我们注意了,就复杂了在哪儿,那现在我A里边也有test b里边也有test,那这个时候它到底这个调T的时候是调A的T还是调B的T呢?
08:10
掉A的还是掉B的,哎,我们来看看效果,那这时候我们是一直行是不是A的呀?哎还是A的没有掉B的,那如果A里边没有test呢,A里边没有直接来个pass啊这一保存一执行是不是才掉B当中,哎调到B当中呢?那这种情况相对来说就会复杂一点,那它是怎么回事啊,怎么回事?那注意了,如果什么呢?我们这个多个负类当中,哎多个负类中有什么呢?诶有同名的方法啊,有同类的方法则会什么呢?则会先在什么呀?诶第一个负类中什么呀?哎,寻找然后什么呢?然后找第二个,哎然后什么呢?然后找第三个。哎,然后找第三个,然后干嘛呀?哎以什么呀?哎前边的会什么呢?会覆盖掉什么呀?哎覆盖后边的什么意思?现在C里边有两个负类,一个是A,一个是B,如果A里边也有test b里边也有用谁的谁在前边用谁的,A的在前边就用A的的在前边就用B的,那现在来看A在前边一看是不是A的呀,如果我这掉了一个个,我们就来一个B逗号,一个AB,这一保存一执行是不是就是B的test,哎,B的test啊,有谁就用谁的,谁在前边用谁的,所以注意前边的会覆盖掉后边,而不是后边的覆盖前边的,那这个就是一个什么呀,多重继承的一个特点啊,一个特点,所以你现在像看我们这个图,当我们去调一个C的方法的时候,它会,它实际上寻找的过程比较麻烦啊叭较麻烦,我们可以把这图啊,我们再复杂一点,我们再想一种复杂的情况,那现在我们A里边有这个有这个B对吧,有这个B,那这个时候。
09:54
那我可能还有一个什么呢?还有一个C,还有一个D。B这个类就更复杂了,B这个类呢,我让他干嘛呢?哎,我让它继承A。
10:06
然后干嘛呢?哎,继承C。然后干嘛呢?哎,然后继承什么呀,哎,继承比。那现在这种情况是不是就是特别的复杂的一种情况,哎,特别复杂,我这个给他换个颜色吧,换个颜色。哎,那这就是一个多重继承,那现在我们这个D同时继承了ABC3个负类,而C又继承了AB,那这个时候当我去用D的时候,我去用D里边的一个属性,比如说我用D里边的一个test,它是怎么找的,它是怎么找的,这个流程我们简单说一下,你不用考虑的,记得过于清楚,这东西我们了解一下啊,首先找的时候是不是还是先在自身里找啊,如果自身里有T,那省事了,剩下的是不是都不用找了?哎,如果自身里没有,他要去哪找?他要去他的第一个副类,诶第一个副类是A,就去A里找,第二个副类是B,第一个副类是B就去B找,第一个副类是C,就去C里找,那我们这假设它第一个负类是A,那就干嘛,他就会去A里找。
11:14
去A里找啊,那去A里找,如果A里有test就用了,如果A里没有呢,它会去A的负类中去找,A的负类是谁呀?Object是不是第二个就去这找啊,哎,这找如果有就用,如果没有呢,继续找,没有的话A里边没有,A是第一个负类,第一个负类里没有了,再去第二个负类,第二个负类是不是B呀?哎,再去第二个负类的B里边去找,那这是我们第三个找的,哎,第三个找的那B里边有就用了,如果B里边没有呢?哎,再去B的负类当中去找啊,再去B的负类当中找,那么同学说,老师,那这object刚才不是找过一遍了,还会不会再找了,那注意了,找过一遍这个时候它就不会再找了,为什么?因为再找的话,性能是不是很差呀?哎,性能就很差,所以找过一遍就不会再找了,为了提高什么呀,提高性能,所以B联边没有再去哪找,诶再去第三个负类哪找,C里边去找,诶C里边去找,C里边去找有没有有就用没有干嘛,没有再去C的负类去找,那就。
12:14
就先找A,再找B,但是由于A和B之前是不是都找过来,哎,所以这时候他就不会去找了啊,不会去找了,所以你听我去描述整个过程,你就会发现,当我们有一个多重继承的时候,我们去找方法的时候,这个过程是不是极为的复杂呀,哎,极为的复杂,所以这里边注意没有特殊情况的时候,我们尽量干嘛不要去用什么呀,多重继承啊,前边的会覆盖到后边的,就是说前边负类的方法啊,写完整,前边父类的方法会覆盖后边,哎负类的一个方法,所以这块注意多重继承的情况会非常的非常复杂,所以没有极其特殊的情况,一般干嘛呀,哎,不要去。用啊,一般不要去用多重继承好,那这个是我们说一个多重继承啊,还是多重继承了解一下就好了,不用过于深入的去还呃了解一下,因为我们尽量买避免去使用,因为这样会导致我们代码过于的复杂啊,我们来停一下。
我来说两句