您的位置: 网站首页> python面向对象> 当前文章
子类执行父类同名方法super(),新式类,object基类
老董-我爱我家房产SEO2020-04-05177围观,139赞
子类可以继承父类的方法,可以重写父类的方法,但更多的时候我们想在重写父类的方法时也执行父类的方法(也就是说扩展父类的已有方法)。这种情况如何实现呢?我们从用代码案例来做了解。
子类执行父类构造方法可以直接通过父类名.__init__的方式调用,也可以使用super()函数。
1)通过super()函数子类执行父类的方法
# -*- coding:utf-8 -*- class Person(): def __init__(self,name,blood): self.name = name self.blood = blood def eat(self,num): print(f'{self.name}吃了{num}碗米饭') def add_blood(self,num): self.eat(num) self.blood = self.blood * num print(f'{self.name}血值变为{self.blood}') class ShuiHu(Person): def __init__(self, name, blood, age): super().__init__(name, blood) # 执行父类方法 self.age = age def add_blood(self,num,place): # super().add_blood(num) # 简写方式 super(ShuiHu, self).add_blood(num) print(f'{self.name}去{place}杀敌') if __name__ == "__main__": ws = ShuiHu('武松',110,28) print(ws.__dict__) ws.add_blood(2,'景阳冈')
{'name': '武松', 'blood': 110, 'age': 28} 武松吃了2碗米饭 武松血值变为220 武松去景阳冈杀敌
2)通过类名执行父类的方法
# -*- coding:utf-8 -*- class Person(): def __init__(self,name,blood): self.name = name self.blood = blood def eat(self,num): print(f'{self.name}吃了{num}碗米饭') def add_blood(self,num): self.eat(num) self.blood = self.blood * num print(f'{self.name}血值变为{self.blood}') class SanGguo(Person): def __init__(self,name,blood,age): Person.__init__(self,name,blood) # 先执行父类方法 self.age = age def add_blood(self,num): Person.add_blood(self,num) print('又强大了,,,,') if __name__ == "__main__": zf = SanGguo('张飞',100,30) print(zf.__dict__) zf.add_blood(3)
{'name': '张飞', 'blood': 100, 'age': 30} 张飞吃了3碗米饭 张飞血值变为300 又强大了,,,,
super().方法名()的写法等价于super(类名, self).方法名(),前者是一种简写,在python3中普遍使用。
在这种单继承(只继承1个父类)场景里super()函数的效果就是调用父类,在多继承中super()会按照1种叫mro顺序(方法解析顺序,Method Resolution Order)来调用父类。
新式类与object类
python2虽然已经是历史了,但是新式类这个概念还是要稍作了解。在python2中显式继承object类的是新式类,否则是经典类。新式类和经典类在super()等方式使用还有些区别,因为python2已进入历史垃圾堆所以不做介绍。
python3中默认都是新式类(他们隐式的继承了object类)。
object类可以参考object基类,显式的意思就是需要你写出来class Chinese(object),隐式就是不需要专门去写class Chinese()。
很赞哦!
python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群
相关文章
文章评论
-
子类执行父类同名方法super(),新式类,object基类文章写得不错,值得赞赏
站点信息
- 网站程序:Laravel
- 客服微信:a772483200