第一時(shí)間收到精彩推送!
Python Every Day, 第 7 天
我們知道Python是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,既然面向?qū)ο缶蜕俨涣死^承。
繼承:表示子類(lèi)可以使用其父類(lèi)中方法。
在Python中,可以通過(guò)super() 函數(shù)來(lái)調(diào)用父類(lèi)的方法。
如下所示,我定義了一個(gè) Person 類(lèi),有 說(shuō)、唱、rap、籃球 這四個(gè) 方法。
class Person():
def speak(self):
print('i can speak')
def sing(self):
print('i can sing')
def rap(self):
print('i can rap')
def basketball(self):
print('i can basketball')
如果只有一個(gè)類(lèi) 直接實(shí)例化.函數(shù)名的方式進(jìn)行調(diào)用即可。
假設(shè)我現(xiàn)在有個(gè)Student (學(xué)生類(lèi)),同樣也可以說(shuō)、唱、Rap、籃球。如果再重新寫(xiě)一遍這四個(gè)函數(shù)就比較麻煩。因此這個(gè)時(shí)候就可以用到繼承。學(xué)生類(lèi)來(lái)繼承Person類(lèi)(也就是說(shuō)Student是Person的子類(lèi),Person是Student的父類(lèi))
如下所示
# Student(Object) 括號(hào)中的類(lèi),表示要繼承的類(lèi)
class Student(Person):
pass
# Student1(Object) 括號(hào)中的類(lèi),表示要繼承的類(lèi)
class Student1(Person):
def study(self):
print('i like study')
if __name__ == '__main__':
# 實(shí)例化一個(gè)Student對(duì)象
s = Student()
s.rap() # i can rap
s.basketball() # i can basketball
s1 = Student1()
s1.rap() # i can rap
s1.study() # i like study
Student、Student1 都繼承了Person類(lèi)。
Student只會(huì) 說(shuō)、唱、rap、籃球。而Student1 還喜歡學(xué)習(xí)。可以再定義一個(gè)study函數(shù)。
上面只是用簡(jiǎn)單的代碼介紹了一下Python中的繼承。還沒(méi)有說(shuō)到如何用super()來(lái)調(diào)用父類(lèi)的方法。
在子類(lèi)中如果需要去掉用父類(lèi)的方法時(shí),可以通過(guò) super(). 父類(lèi)方法 的形式完成。
示例:
class A:
def get_name(self):
return 'my name is xiaoming'
class B(A):
def my_info(self):
print('i am 18 years old')
# 通過(guò)super() 函數(shù) 調(diào)用父類(lèi)A 中的get_name函數(shù),返回字符串
print(super().get_name())
print('i like rap and basketball')
if __name__ == '__main__':
b = B()
'''
輸出:
i am 18 years old
my name is xiaoming
i like rap and basketball
'''
b.my_info()
在B方法中調(diào)用my_info 時(shí),可以直接通過(guò)父類(lèi)A中的get_name 方法 獲取到名字。
問(wèn)題: 如果一個(gè)子類(lèi)繼承了兩個(gè)父類(lèi),并且父類(lèi)中的方法名相同。那究竟會(huì)調(diào)用哪個(gè)類(lèi)呢?
這個(gè)問(wèn)題可以通過(guò)類(lèi)的內(nèi)置屬性 __mro__ 去查看調(diào)用順序。這個(gè)方法主要是在多繼承時(shí)判斷方法、屬性的調(diào)用路徑。
class A:
num = 1
def method(self):
print('A ..method')
class B:
num = 2
def method(self):
print('B .. method')
class C(A, B):
num = 3
pass
if __name__ == '__main__':
c = C()
print(C.__mro__) # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print(c.num) # 3
c.method() # A ..method
如上,C.__mro__ 打印結(jié)果可以執(zhí)行順序?yàn)?C -> A - >B
因此print(c.num)。因?yàn)閏中有num屬性,所以會(huì)打印3.
執(zhí)行c.method時(shí) 。因?yàn)閏中沒(méi)有method屬性,會(huì)去A中查找,則輸出 A..method。