1. 程式人生 > >在子類中重用父類的方法或屬性

在子類中重用父類的方法或屬性

self. mce 返回 繼承關系 怎麽 gre 沒有 nbsp dem

在子類派生出新發方式中重用父類的方法,有兩種實現方式
1.指名道姓(不依賴繼承)
# class Hero:
# def __init__(self,nickname,life_value,aggresivity):
# self.nickname=nickname
# 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,nickname,life_value,aggresivity,weapon):
# Hero.__init__(self,nickname,life_value,aggresivity)
# self.weapon=weapon
#
# def attack(self,enemy):
# Hero.attack(self,enemy) #1,指名道姓
# print(‘from Garen class‘)
#
# class Riven(Hero):
# camp=‘NOXUS‘
#
#
# g=Garen(‘草叢倫‘,100,30,‘金箍棒‘)
# r=Riven(‘銳雯雯‘,80,35)
# print(g.__dict__)
# print(r.life_value)
# g.attack(r)
# print(r.life_value)



‘‘‘
# 2.super() (依賴繼承)
class Hero:
def __init__(self,nickname,life_value,aggresivity):
self.nickname=nickname
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):
super(Garen,self).attack(enemy)#依賴繼承
print(‘from Garen class‘)


class Riven(Hero):
camp=‘Noxus‘
g=Garen(‘草叢倫‘,100,30)
r=Riven(‘銳雯雯‘,80,35)
g.attack(r)
print(r.life_value)
‘‘‘

‘‘‘
class Hero:
def __init__(self,nickname,life_value,aggresivity):
self.nickname=nickname
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,nickname,life_value,aggresivity,weapon):
# self.nickname = nickname
# self.life_value = life_value
# self.aggresivity = aggresivity
# self.weapon = weapon
# Hero.__init__(self,nickname,life_value,aggresivity)
#super(Garen,self).__init__(nickname,life_value,aggresivity) #依賴繼承

super().__init__(nickname,life_value,aggresivity) #依賴繼承(Python3)
self.weapon=weapon


def attack(self,enemy):
Hero.attack(self,enemy) #指名道姓重用
print(‘from Garen class‘)

class Riven(Hero):
camp=‘NOXUS‘


g=Garen(‘草叢倫‘,100,30,‘金箍棒‘)
r=Riven(‘銳雯雯‘,80,35)
print(g.__dict__)
print(r.life_value)
g.attack(r)
print(r.life_value)
‘‘‘
那麽super是怎麽實現在父類中查找的呢
一個小驗證方法:

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‘>] #C.mro() c的查找順序,新式類(python3特有)

from A

from B

以上看出父類重用,是子類以mro()的順序查找的,不論父類之間有沒有繼承關系
PS mro()‘老子才不管你老子是誰,老子只按老子的查找順序查找‘
 

在子類中重用父類的方法或屬性