对Python3之方法的覆盖与超级函数详解

  

<强> #覆盖

  

覆盖:在继承关系中,子类实现了与基类同名的方法,在子类的实例调用该方法时,实例调用的是子类的覆盖版本。

  

通俗的讲,就是小明继承了他⑧的自行车,经过自己的改,装成了电动车,那么小明每次骑的就是电动车了(这个电动车是可以脚蹬的,后边栗子会继续使用)

  

举个简单的栗子:

        类自行车():   def运行(自我):   打印(“我是自行车的运行方法”)      类E_Bicycle(自行车):#继承自行车   def运行(自我):   打印(“我是电动车的运行方法”)      b=自行车()   b.run ()      e_b=E_Bicycle ()   e_b.run ()   之前      

打印结果:

        我是自行车的运行方法   我是电动车的运行方法      

注意:方法的覆盖必须要同名,例如这个栗子是继承与派生关系,方法还同名,只是打印被改变了

  

这个栗子不是特别明显,改动一点点:

        类自行车(对象):   def __init__(自我、名称):   self.name=名字      def运行(自我):   打印(“我是% s的运行方法的% self.name)      类E_Bicycle(自行车):#继承自行车   def __init__(自我、名字、年龄):   self.name=名字   自我。年龄=年龄      def运行(自我):   打印(“我是% s的运行方法,被主人改装% s年了' % (self.name self.age))      b=自行车(“自行车”)   b.run ()      e_b=E_Bicycle(“电动车”,3)   e_b.run ()   之前      

改变了名称值,并且加入了年龄参数。

  

<强>那么如何调用父类的方法呢或属性呢?

  

#超级
  超级(cls obj)返回绑定超类的实例(要去obj必须是cls类型的实例)
  超级的作用:间接调用父类覆盖方法

  

举个栗子:

        #示意超级函数间接调用父类中被覆盖的方法      甲级:   def工作(自我):   打印(“A.work被调用”)      B类(一个):   “B类继承“类”   def工作(自我):   打印(“B.work被调用”)      def super_work(自我):   “调用B类自己的工作方法”   self.work () # B.work被调用,调用自身类的方法,和调用属性一样   超级(B,自我).work () #。工作被调用,借助超调用父类被覆盖的方法   super () .work () #。工作被调用这种必须在方法内使用,可以省略(自身类)参数      b=b ()   # b.work () # b.work被调用,调自身的类   #超级(B, B) .work () # A.work被调用(使用超级是调用B的父类)   #超级().work () # RuntimeError:超级():没有参数不知道调用谁,所以此种省略参数的只能在内部使用   b.super_work() #以上懂了,这回也就懂了   之前      

<>强显示调用基类的初始化方法:

  

当子类中实现了__init__(双下划线的初始化方法,貌似不显示)方法,基类的构造方法并不会被调用,此时需要显示调用

  

举个栗子:

        #示意显示调用初始化方法   类人:   def __init__(自我,n):   self.name=n   自我。年龄=打印(“人类初始化的方法被调用了”)      def信息(自我):   打印(“姓名',self.name)   打印('年龄”,self.age)      类学生(人类):   def __init__(自我,n, s=0):   #超级(学生,自我)。__init__ (n) #调用父类的初始化方法复习上边讲的   超级()。__init__ (n) #调用父类的初始化方法内部省略参数   自我。分数=s #增加一个属性   打印('学生的初始化方法被调用了”)      def信息(自我):#方法的重写   super () . info() #显示调用父类的方法   打印(“成绩是:‘,self.score)      s1=学生(“张三',20,80)   s1.infos ()   之前      

打印结果:

        人类初始化的方法被调用了   学生的初始化方法被调用了   姓名张三   年龄20   成绩是:80      

对Python3之方法的覆盖与超级函数详解

  

改写上述的自行车与电动车的栗子:

        类自行车(对象):   def __init__(自我、名称):   self.name=名字      def运行(自我):   打印(“我是% s的运行方法的% self.name)      类E_Bicycle(自行车):#继承自行车   def __init__(自我、名字、年龄):   super () . __init__(名字)#调用父类的名称属性   自我。年龄=年龄      def运行(自我):   super () .run() #调用父类的运行方法   打印(“被主人改装% s年了' % (self.age)      b=自行车()   b.run ()      e_b=E_Bicycle(“电动车”,3)   e_b.run ()   

对Python3之方法的覆盖与超级函数详解