在子类中重用父类的属性

在子类派生出的新的方法中重用父类的方法,有两种实现方式

一、指名道姓(不依赖继承)

class Hero:
    def __init__(self,nickname,life_value,aggresivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggresivity = aggresivity

    def attack(self,enemy):
        enemy.life_value -= self.aggresivity

class Libai(Hero):
    camp = "Tangchao"
    def __init__(self,nickname,life_value,aggresivity,weapon):
        Hero.__init__(self,nickname,life_value,aggresivity)
        self.weapon = weapon
    def attack(self,enemy):
        Hero.attack(self,enemy)  # 指名道姓,有几个参数就需要传几个参数
        print("from Libai Class")

class Huamulan(Hero):
    camp = "Changcheng"

l1 = Libai("进一步",100,60,"")

二、super()()(依赖继承关系)

class Hero:
    def __init__(self,nickname,life_value,aggresivity):
        self.nickname = nickname
        self.life_value = life_value
        self.aggresivity = aggresivity

    def attack(self,enemy):
        enemy.life_value -= self.aggresivity

class Libai(Hero):
    camp = "Tangchao"
    def __init__(self,nickname,life_value,aggresivity,weapon):
        #Hero.__init__(self,nickname,life_value,aggresivity)

        #super(Libai,self).__init__(nickname,life_value,aggresivity)  # python2的写法
        super().__init__(nickname,life_value,aggresivity)  # python3的写法
        self.weapon = weapon
    def attack(self,enemy):
        super(Libai,self).attack(enemy)  # 依赖继承  super(Libai,self)是指对象,.attack是调用对象的方法
        print("from Libai Class")

class Huamulan(Hero):
    camp = "Changcheng"

l1 = Libai("进一步",100,60,"")

这两种方式的区别是:方式一是跟继承没有关系的,而方式二的super()是依赖于继承的,并且即使没有直接继承关系,super仍然会按照mro继续往后查找

#A没有继承B,但是A内super会基于C.mro()继续往后找
class A:
    def test(self):
        super().test()
class B:
    def test(self):
        print('from B')
class C(A,B):
    pass

c=C()
c.test() #打印结果:from B


print(C.mro())
#[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
posted @ 2020-01-10 14:34  南啾  阅读(212)  评论(0编辑  收藏  举报