美文网首页
python---核心知识11之面向对象三大特性之继承2

python---核心知识11之面向对象三大特性之继承2

作者: hello_我的哥 | 来源:发表于2018-03-21 19:26 被阅读62次

    在前面一节我们讲了继承的资源的重申,以及继承资源的使用,现在我们接着讲继承资源的覆盖以及资源的累加;

    继承资源的覆盖:其实在讲了继承资源的使用,继承资源的覆盖就没什么可讲的了,资源的覆盖就指的是父类有个资源,子类把父类的资源给覆盖掉了,举个例子:

    下面这个代码,我们A-B-C这样的继承关系,最顶层的父类C有一个text方法,然后我们在A类调用了这个方法,执行的是B类的方法,这样看起来其实就像是B的资源覆盖了A的资源,也就做方法的重写,虽然理解是这样理解,但是其实本质不是资源的覆盖,这点大家也要清楚,本质其实是C有C的资源,C的资源仍然没变,B只是增加了一个text资源,只不过通过MRO访问顺序,就好像是资源的覆盖;

    然后这里有一个注意点,就是我们通过A去访问B的text方法,那个self到底是谁呢?到底是A呢,还是B呢,我们做一个测试:

    通过下面的代码测试我们知道通过谁去调用实例方法,或者类方法,那么就把谁传到方法里面去;

    资源的累加:指的就是在类的基础之上,增加了一些额外的资源,这里分为两种情况,一种情况是子类相对于父类增加了一些额外的资源,一种是在被覆盖的方法基础之上,增加了新的内容;

    对于第一种情况,子类相对于父类增加额外的资源,这个没啥可说的,这个资源就是子类独有的,就和普通的增加资源一样;

    第二种情况是在覆盖的方法基础之上,增加新的内容:意思是父类的方法也要执行,在父类的方法执行的基础之上,增加子类的执行:比如我们给子类增加实例属性:

    下面这个代码就是覆盖了父类的方法,增加了新的内容,但是父类的方法并未执行,这样的话也不叫做覆盖的方法基础之上了,现在我们来看看如果要解决这个问题,要怎么做;

    方法一:用最死板的方法,就是把父类的方法的代码考下来,当然这不可取,就不演示了;

    方法二:就是在执行init方法的时候,我们去调用父类的init方法:

    下面这个就是在调用子类的方法的时候,我们在方法里面再去调用父类的方法,由于方法需要传一个实例,我们就把子类的实例传进去,这样子类也拥有了这个属性,也就在覆盖父类方法的基础上增加了新的内容

    但是这种方法也有它的问题,下面我们看看是啥问题:

    我们看下面的继承关系,是一种菱形继承,使用的是用父类去调自己的方法,我们可以看到最顶层的父类D的init方法执行了两次,

    方法三:使用super,super也是一个类,用于在高优先级的类中,通过super()调用低优先级类的方法;它只在新式类中有效,它的作用是沿着MRO链条,找到下一节点,去调用对应的方法;在python3.x版本之前super()需要接收两个参数,第二个参数是找这个参数的MRO顺序,也是默认传到父类的参数,第一个参数是找这个参数的下一个节点;其实说白了super的作用就是找出MRO的下一节点;

    下面的代码就是用super()调用,大家可以看到父类D的init方法并没有执行两遍了,还有一点就是在python3.x版本,super不用手动给参数,解释器会根据上下文自动填参数;

    super()调用注意事项:1.我们知道super()第一个参数是找这个参数的下一个节点,其实就是自己类的下一个节点,有的同志估计会写成self.__class__,以为这样可以动态加入,但是其实这样是不可取的,因为我们的self可能是它的子类的实例,这样的话就变成了子类,就会陷入死循环:

    2.使用super()最好不要和类去调用方法 混用,这样容易混乱,造成数据的紊乱;这里就不举例了;

    总结:至此,继承就已经结束了;继承看着这么多东西,其实继承主要就是对于资源继承的分析。所有的东西都是围绕资源进行展开的,主要就是1.资源的继承,2.资源的使用,3.资源的覆盖,4.资源的累加;这几个方面其实并不是单独的,而是互相有关系的;只能说要多敲代码,慢慢体会;

    相关文章

      网友评论

          本文标题:python---核心知识11之面向对象三大特性之继承2

          本文链接:https://www.haomeiwen.com/subject/rzpiqftx.html