Python面向对象子类中重用父类的属性

一、指名道姓的方式,不依赖于继承

示例代码如下:

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

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

class Garen(Hero):
    camp = 'Demacia'

    def attack(self, enemy):
        Hero.attack(self, enemy)
        print('from Garen class')

class Riven(Hero):
    camp = 'Noxus'

g1 = Garen('草丛伦', 100, 30)
r1 = Riven('锐雯雯', 80, 50)
g1.attack(r1)
print(r1.life_value)

结果为:

from Garen class
50

从以上结果可以看出,即执行了自己的特有方法,又执行了父类中继承的方法

想为草丛伦增加一个weapon私有属性,代码如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Hero:
    def __init__(self, nick_name, life_value, aggresivity):
        self.nick_name = nick_name
        self.life_value = life_value
        self .aggresivity = aggresivity

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

class Garen(Hero):
    camp = 'Demacia'

    def __init__(self, nick_name, life_value, aggresivity, weapon):
        self.nick_name = nick_name
        self.life_value = life_value
        self.aggresivity = aggresivity
        self.weapon = weapon

    def attack(self, enemy):
        Hero.attack(self, enemy)
        print('from Garen class')

class Riven(Hero):
    camp = 'Noxus'

g1 = Garen('草丛伦', 100, 30)
r1 = Riven('锐雯雯', 80, 50)
g1.attack(r1)
print(r1.life_value)

结果报错:

Traceback (most recent call last):
  File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/12 在子类中重用父类的属性.py", line 31, in <module>
    g1 = Garen('草丛伦', 100, 30)
TypeError: __init__() missing 1 required positional argument: 'weapon'

报错提示缺少一个weapon位置参数,加上位置参数就可以实例化成功了,

但是发现了重复代码,怎样减少重复代码呢,可以使用

Hero.__init__(self, nick_name, life_value, aggresivity)

二、super()方法,依赖继承

 super(Garen, self).attack(enemy)
 super().__init__(nick_name, life_value, aggresivity)

三、super也会按照mro顺序区查找属性,

示例代码如下:

class A:
    def f1(self):
        print('from A')
        super().f1()

class B:
    def f1(self):
        print('from B')
        
class C(A,B):
    pass

print(C.mro())

c = C()
c.f1()

结果为:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
from A
from B

可以看出,super并没有去找父类,而是安装mro顺序查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值