00:00
好,刚刚呢,我们简单说了一下继承,然后最后呢,我们提出一个问题啊,就是说我们现在这个dog这个类继承了animal这个类,对吧?Animal这个类里边给我们提供了三两个方法,一个叫做run,还有一个叫sleep啊跑,还有这个睡觉的方法,呃,那我们说了,正常情况下animal的这两个方法应该是被我们的哎dog所继承,也就说这两个方法在我们dog里边直接就可以用,但是我们说了一种情况干嘛呢?如果在dog里也有一个run,这时候animal里也有,Dog里也有,那这个时候这个run到底是谁的呢?到底是调animal的还是调我们这个dog的呢?那这里边我们就要说一个新的问题啊来,我们还是创建一个新的文件,我们说什么呢?诶零九,我们叫做一个重写,重写这样一个PY,呃,然后啊,我们把这点东西我们先复制一下啊,复制粘过来。
01:00
粘过来以后呢,我改一下,呃,我们就剩一个这个dog,呃,然后呢,这留一个这个animal,那现在来看我们这个类啊,Animal里边有两个方法,一个是run,还有一个是sleep,诶dog里边有一个bar,一个这个run,那现在我们的dog它继承了animal啊,继承了animal,那这个时候我们要看一下,那我这个时候来创建一个dog类实例,诶创建我们这个dog类的一个实例,这里边我们直接来一个D,等于一个这个dog,这创建完了,我这块掉一个D点一个run,那这里边如果dog里边没有这个run,很明显我们会动物会跑,这个是不是animal里边的方法呀?诶animal里方法,但是现在我dog里有这个run了,有这个run了,这时候我再掉会怎么办啊,会怎么办?来我们这儿一直行走一个干嘛了,狗跑,也就是说现在掉的是谁?诶现在掉的还是不是animal里面的,诶不是掉的是。
02:01
什么掉的是我们dog类里边这个run方法啊,Run方法其实这也很好理解,因为我们这个实力是dog的,所以我们要掉的话,肯定是找离得近那个,不会说找离得远那个,对吧?所以这里边我们来说一下叫什么呢?哎,如果在我们这个子类中啊,子类刚才说了,像这个我们是不是叫dog叫子类啊,Animal叫父类,因为我们dog继承了animal在子类中,如果有什么呢?诶和我们这个叫父类同名的方法,哎,同名的方法则,哎通过我们这个子类实例啊,注意你得是子类实例,你别创建一个animal实例啊,通过子类实例去调用方法是,诶会什么呢?诶会调用我们这个子类的方法,而什么呢?而不是负类啊,而不是负类的方法,这1.1定要注意,所以注意,那这个特性叫什么呢?哎,这个特。
03:01
特点我们什么呢?哎,我们称为叫做一个方法的重写啊,叫做一个方法的重写,或者也可以叫方法的一个覆盖,也就说子类的方法覆盖掉了什么呀,覆盖掉了这个覆类当中的,诶那英文呢,叫做一个over,一个什么呀?Over right啊over right叫一个重写,其实也很好理解啊,也很好理解,那就像我们我们生活中一样,对吧?我们可以从我们的父母那继承一系列东西,比如说我从父母那儿继承一辆汽车,继承了汽车,但是可能这辆汽车我不喜欢,我自己就买了一辆,那我是不是肯定是用我自己这个呀,等于用我自己这样的汽车覆盖掉了父母给我提供的一个汽车,那这就叫什么呀?诶,这就叫重写,那这叫重写,那重写是一个所有语言里都会有这么一个特点,那也就是说它可以确保在你去继承了父类的一些这个属性,一些方法的时候的同时,也确保。
04:01
你的可以干嘛呀,诶你自身的这个类当中可以做一些什么呀,简单的一个修改啊,简单一个修改,这叫一个什么呀,重写诶只要名名字一样,它就会干嘛呀,哎就会重写啊,就会重写,那现在我们来看这样一种情况啊,看这样一种情况,呃,我们呢,创建几个类啊,我来一个这个class,诶class我们简单一点,Class一个这个AAA呢,我们不给它设置副类,那不不给它设置默认就是OB Jack啊,我写一个,然后A里边呢,我们放一个方法,哎,定义一个这个FN,或者我叫做一个test啊test然后呢,这里边不要忘了写这个self啊self,然后这儿呢,我写一个叫做print啊print我们这来一个AA啊,写三个A啊,三个A简单一点,然后在这我再写一个,这来一个class,一个B,诶,我让B呢,继承A啊,让B继承A,那现在我这不写,直接来一个这个pass,然后在这我们。
05:01
来一个class,来一个什么呢?C,诶C呢,我让他继承B,同样我这也来一个这个pass,现在这关系应该很明显,最上边A是继承自我们这个object啊object然后呢,诶A继承自object,然后干嘛?B继承自A啊然后呢,C继承子B,他们是这么一个关系吧,诶说白了,诶A是爷爷,B是父亲,C是儿子,而这个object是谁啊,诶是我们那个最大那个,哎,B组对吧,B组,那这个时候我们来创建一个C的实例,哎,创建一个这个C的这个实例,诶那这块我们直接来一个C,等于一个这个CC的实力,这时候是不是就有了,哎有了以后我们这掉一个C,点一个T,问题来了,那这个时候它会掉谁?哎,他会出现什么结果?哎猜想都不用想,肯定是他对吧,因为就一个啊,就一个,所以我这一执行是不是就AA呀,AAA那这。
06:01
这时候看着了,我换一个,我在B里边也定义一个,我这打一个什么呢?诶bbb这回会是谁?哎,我们在这一执行是不是就是bbb呀?哎,然后在这我们再写一个,我在C里边也定义一个,我来什么呢?哎,来一个这个CCC。诶,CCCC啊,然后这一保存,我们这一执行走一个是不是就是CC啊,哎,那你会发现它是怎么找的啊,它是怎么找的?哎,那这里边注意了,我们来说一下,当当哎我们调用一个对象的这个方法时啊,当我们调用一个对象的方法时,什么呢?它会什么呢?会优先去我们这个当前对象中寻找,是否具有该方法啊,他会先去当前对象中寻找,那我们说了,如果有则直接调用啊,如果有则直接调用,如果什么呢?如果没有则去我们这个什么呀,当前对象的什么呀?哎,负类中寻找,哎,父类中寻找。
07:14
其实这也非常好理解是吧,我再用语言总结一下啊,如果有则什么呢?诶如果负类中有则什么呢?则直接调用我们这个,诶负类中的这个方法,诶那如果什么呢?诶如果没有则去什么呀?则去我们这个诶负类的什么呀?诶负类中寻找啊,负类的负类中寻找,所以当我们在这掉一个c.T的时候,它会先在C这个类当中寻找有没有T子,有怎么办?有就掉了啊如果没有呢,没有再去负类,负类是谁呀?负类是不是B呀?哎去B当中去寻找,那B中如果有就掉了,如果B中也没有呢?诶就去A中寻找,那A中也没有呢?诶A中也没有,就去A的负类object中去寻找啊所以它是什么呀?它是向自己没有就去负类中去找,哎,以此类推,哎,以此类推,如果你上边还有负类,是不是继续找啊,诶继续找,那直到什么呢,他不能总找啊你。
08:14
总有没有的一种情况,对吧?直到什么呢?诶,直到找到我们这个object,如果什么呢?诶如果依然没有找到,则什么呢?则报错,所以在这比如说我调一个C,点一个hello,在B里边,在C里边没有hello b里边没有,A里边没有,Object里边也没有,那这个时候一执行干嘛了,是不是就报错了,告诉你see bank has no attribute哈,告诉你没有这个属性啊,没有这个属性,所以注意它是一层一层往上找的,所以我们才能达到一个什么呀,诶重写的效果啊,我可以让子类的去重写父类的一个什么呀,诶重写父类的一个方法啊,那这个流程一定要记住,这就是我们重写,其实非常好理解啊,非常好理解,我们还是来停一下。
我来说两句