<强> #覆盖强>
覆盖:在继承关系中,子类实现了与基类同名的方法,在子类的实例调用该方法时,实例调用的是子类的覆盖版本。
通俗的讲,就是小明继承了他⑧的自行车,经过自己的改,装成了电动车,那么小明每次骑的就是电动车了(这个电动车是可以脚蹬的,后边栗子会继续使用)
举个简单的栗子:
类自行车(): 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
改写上述的自行车与电动车的栗子:
类自行车(对象): 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之方法的覆盖与超级函数详解