您的位置: 网站首页> 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。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    子类执行父类同名方法super(),新式类,object基类文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200