您的位置: 网站首页> python面向对象> 当前文章
子类执行父类同名方法super(),新式类,object基类
老董-我爱我家房产SEO2020-04-05186围观,144赞
子类可以继承父类的方法,可以重写父类的方法,但更多的时候我们想在重写父类的方法时也执行父类的方法(也就是说扩展父类的已有方法)。这种情况如何实现呢?我们从用代码案例来做了解。
子类执行父类构造方法可以直接通过父类名.__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基类文章写得不错,值得赞赏


