彩虹然

rainbow-ran

Python3.7之派生

子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准。

派生就是子类在继承父类的基础上衍生出新的属性。子类中独有的,父类中没有的;或子类定义与父类重名的东西。子类也叫派生类。

class Hero:
    camp = 'Hero'  # 父类原有的camp数据属性

    def __init__(self, nickname, attack_value, life_value):
        self.nickname = nickname
        self.attack_value = attack_value
        self.life_value = life_value

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


class Garen(Hero):
    camp = 'Demacia'


class Riven(Hero):
    camp = 'Noxus'


role1 = Garen('A', 50, 100)
role2 = Riven('B', 30, 80)
print(role1.camp)
print(role2.camp)
'''
Demacia
Noxus
'''

在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值。

class Garen(Hero):
    def __init__(self, nickname, attack_value, life_value, skin):
        Hero.__init__(self, nickname, attack_value, life_value)
        # 调用父类功能,注意这里必须要有self
        self.skin = skin  # 新属性

    def attack(self, enemy):
        Hero.attack(self, enemy)  # 调用父类功能,参数必须与父类一致
        print('From Garen')  # 自己新的功能
    camp = 'Demacia'

严格来说,上述Hero.__init__(self,...),不能算作子类调用父类的方法。因为我们如果去掉(Hero)这个继承关系,代码仍能得到预期的结果。

posted @ 2020-01-17 11:15  彩虹然  阅读(264)  评论(0编辑  收藏  举报