一、指名道姓的方式,不依赖于继承
示例代码如下:
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顺序查找