七、面向物件_5.繼承
阿新 • • 發佈:2021-10-28
繼承
面向物件的繼承指的是多個類之間的所屬關係,即子類預設繼承父類的所有屬性和方法
python中,所有類預設繼承object類,object類是基類,其他子類叫派生類
class.__mro__
功能:返回 class 的父類繼承關係
單繼承
父類和子類一一對應的繼承
class A(object): def __init__(self): self.num = 100 def play_soccer(self): print(self.num) class B(A): pass b = B() print(b.num) b.play_soccer() 100 100
多繼承
子類同時繼承多個父類
class Ronaldinho(object):
def __init__(self):
self.skill = '牛尾巴'
def play_soccer(self):
print(f'技能:{self.skill}')
class Messi(object):
def __init__(self):
self.skill = '油炸丸子'
def play_soccer(self):
print(f'技能:{self.skill}')
子類中所有屬性和方法都從父類繼承
當一個子類有多個父類,且不同父類中存在同名屬性或方法時,預設使用前面的父類
class Neymar1(Ronaldinho,Messi):
pass
N1 = Neymar1()
print(N1.skill)
N1.play_soccer()
牛尾巴
技能:牛尾巴
子類中重寫父類同名屬性和方法
如果子類和父類擁有同名屬性或方法,子類建立物件呼叫屬性或方法時,將從子類中呼叫
class Neymar2(Ronaldinho,Messi): def __init__(self): self.skill = '彩虹' def play_soccer(self): print(f'技能:{self.skill}') N2 = Neymar2() print(N2.skill) N2.play_soccer() # class.__mro__ print(Neymar2.__mro__) 彩虹 技能:彩虹 (<class '__main__.Neymar2'>, <class '__main__.Ronaldinho'>, <class '__main__.Messi'>, <class 'object'>)
子類呼叫父類的同名屬性或方法
呼叫父類方法時,為保證其中的屬性也是父類的屬性,必須在呼叫方法前先呼叫父類的屬性初始化
如果在前面呼叫了父類的屬性,父類屬性會覆蓋子類屬性,所以在使用子類屬性前要先呼叫子類初始化
class Neymar(Ronaldinho,Messi):
def __init__(self):
self.skill = '彩虹'
def play_soccer(self):
# 如果不加子類初始化,此處skill屬性值將是上一次呼叫的__init__()內的skill屬性值
self.__init__()
print(f'技能:{self.skill}')
# 把父類的同名屬性和方法再次封裝
def play_ronaldinho_soccer(self):
# 想要呼叫父類的同名屬性和方法,該屬性在父類__init__()初始化位置,所以需要再次呼叫父類中的__init__()初始化
Ronaldinho.__init__(self)
Ronaldinho.play_soccer(self)
def play_messi_soccer(self):
Messi.__init__(self)
Messi.play_soccer(self)
N = Neymar()
N.play_soccer()
N.play_ronaldinho_soccer()
N.play_messi_soccer()
N.play_soccer()
技能:彩虹
技能:牛尾巴
技能:油炸丸子
技能:彩虹
多層繼承
class NewKing(Neymar):
pass
who = NewKing()
print(who.skill)
who.play_soccer()
who.play_ronaldinho_soccer()
who.play_messi_soccer()
彩虹
技能:彩虹
技能:牛尾巴
技能:油炸丸子