在子类中重用父类的方法

#在子类派生出新的方法中,重用父类的方法,有两种 :

 #1。指名道姓的方法(不依赖继承)

  #示例1:

class Hero:
def __init__(self,Nikname, Life_value, Aggressivity):
self.Nikname = Nikname
self.Aggressivity = Aggressivity
self.Life_value = Life_value
def attack(self,enemy):
enemy.Life_value-=self.Aggressivity

class Ruiwen(Hero):
camd = 'demaciy'
def attack(self, enemy):
Hero.attack(self, enemy) #指名道姓的方式 。此时,即使没有继承父类,此方法依然有效
print('from Ruiwen is attack')
class Kelun(Hero):
camd = '猪圈'
pass
g = Ruiwen('大圣', 100, 30)
r = Kelun('猪八戒', 80, 50)
print(r.Life_value)
g.attack(r)
print(r.Life_value)
#输出:

示例2:

class Hero:
def __init__(self,Nikname, Life_value, Aggressivity):
self.Nikname = Nikname
self.Aggressivity = Aggressivity
self.Life_value = Life_value
def attack(self,enemy):
enemy.Life_value-=self.Aggressivity

class Ruiwen(Hero):
camd = 'demaciy'
def __init__(self, Nikname, Life_value, Aggressivity, Weapon):
# self.Nikname = Nikname
# self.Life_value = Life_value
# self.Aggressivity = Aggressivity
self.Weapon = Weapon
Hero.__init__(self, Nikname, Life_value, Aggressivity)
def attack(self, enemy):
Hero.attack(self, enemy) #指名道姓的方式 。此时,即使没有继承父类,此方法依然有效
print('from Ruiwen is attack')
class Kelun(Hero):
camd = '猪圈'
pass
g = Ruiwen('大圣', 100, 30, '金箍棒')
print(g.__dict__)

#输出:

 



 #2.super()   依赖于继承

#示例1:

class Hero:
def __init__(self,Nikname, Life_value, Aggressivity):
self.Nikname = Nikname
self.Aggressivity = Aggressivity
self.Life_value = Life_value
def attack(self,enemy):
enemy.Life_value-=self.Aggressivity

class Ruiwen(Hero):
camd = 'demaciy'
def __init__(self, Nikname, Life_value, Aggressivity, Weapon):
super().__init__(Nikname, Life_value, Aggressivity)
self.Weapon = Weapon
def attack(self, enemy):
print('from Ruiwen is attack')
class Kelun(Hero):
camd = '猪圈'
pass
g = Ruiwen('大圣', 100, 30, '金箍棒')
r = Kelun('猪八戒', 80, 50)
g.attack(r)
print(r.Life_value)





示例2:

class Hero:
def __init__(self,Nikname, Life_value, Aggressivity):
self.Nikname = Nikname
self.Aggressivity = Aggressivity
self.Life_value = Life_value
def attack(self,enemy):
enemy.Life_value-=self.Aggressivity

class Ruiwen(Hero):
camd = 'demaciy'
def __init__(self, Nikname, Life_value, Aggressivity, Weapon):
super().__init__(Nikname, Life_value, Aggressivity)
self.Weapon = Weapon
def attack(self, enemy):
print('from Ruiwen is attack')
class Kelun(Hero):
camd = '猪圈'
pass
g = Ruiwen('大圣', 100, 30, '金箍棒')
r = Kelun('猪八戒', 80, 50)
g.attack(r)
print(r.Life_value)

#输出:

 





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

class C(A, B):
pass
c = C()
c.f1()
print(C.mro())

#输出:

#这里不要以为super在A里面 且A为比较顶层,会找不到B里面的f1 这样想是错误的,应当先明白f1是基于谁去寻找的,它是C的实例化对象c去调用的f1

#然后在A里面找到了f1打印了f1里面的内容,但是随之又遇见super,此时super会基于C的调用f1接着向上从A函数属性里面按照广度查找的方式继续按照mro列表继续向后找,直到

找到打印为止

 

posted on 2019-01-08 15:10  别离  阅读(310)  评论(0编辑  收藏  举报

导航