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

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

示例代码如下:

 1 class Hero:
 2     def __init__(self, nick_name, life_value, aggresivity):
 3         self.nick_name = nick_name
 4         self.life_value = life_value
 5         self .aggresivity = aggresivity
 6 
 7     def attack(self, enemy):
 8         enemy.life_value -= self.aggresivity
 9 
10 
11 class Garen(Hero):
12     camp = 'Demacia'
13 
14     def attack(self, enemy):
15         Hero.attack(self, enemy)
16         print('from Garen class')
17 
18 
19 class Riven(Hero):
20     camp = 'Noxus'
21 
22 
23 g1 = Garen('草丛伦', 100, 30)
24 r1 = Riven('锐雯雯', 80, 50)
25 g1.attack(r1)
26 print(r1.life_value)
27 
28 结果为:
29 
30 
31 from Garen class
32 50

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

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

 1 class Hero:
 2     def __init__(self, nick_name, life_value, aggresivity):
 3         self.nick_name = nick_name
 4         self.life_value = life_value
 5         self .aggresivity = aggresivity
 6 
 7     def attack(self, enemy):
 8         enemy.life_value -= self.aggresivity
 9 
10 
11 class Garen(Hero):
12     camp = 'Demacia'
13 
14     def __init__(self, nick_name, life_value, aggresivity, weapon):
15         self.nick_name = nick_name
16         self.life_value = life_value
17         self.aggresivity = aggresivity
18         self.weapon = weapon
19 
20     def attack(self, enemy):
21         Hero.attack(self, enemy)
22         print('from Garen class')
23 
24 
25 class Riven(Hero):
26     camp = 'Noxus'
27 
28 
29 g1 = Garen('草丛伦', 100, 30)
30 r1 = Riven('锐雯雯', 80, 50)
31 g1.attack(r1)
32 print(r1.life_value)
33 
34 结果报错:
35 
36 Traceback (most recent call last):
37   File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/12 在子类中重用父类的属性.py", line 31, in <module>
38     g1 = Garen('草丛伦', 100, 30)
39 TypeError: __init__() missing 1 required positional argument: 'weapon'

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

 

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

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

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

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

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

示例代码如下:

 1 class A:
 2     def f1(self):
 3         print('from A')
 4         super().f1()
 5 
 6 class B:
 7     def f1(self):
 8         print('from B')
 9         
10 class C(A,B):
11     pass
12 
13 print(C.mro())
14 
15 c = C()
16 c.f1()
17 
18 结果为:
19 
20 [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
21 from A
22 from B

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

 

posted @ 2018-03-18 21:44  xudachen  阅读(956)  评论(0编辑  收藏  举报