常德政府門(mén)戶(hù)網(wǎng)站百度搜索鏈接
七、類(lèi)的繼承
1、定義類(lèi)的繼承
說(shuō)到繼承,你一定會(huì)聯(lián)想到繼承你老爸的家產(chǎn)之類(lèi)的。
類(lèi)的繼承也是一樣。
比如有一個(gè)舊類(lèi),是可以算平均數(shù)的。然后這時(shí)候有一個(gè)新類(lèi),也要用到算平均數(shù),那么這時(shí)候我們就可以使用繼承的方式。新類(lèi)繼承舊類(lèi),這樣子新類(lèi)也就有這個(gè)功能了。
通常情況下,我們叫舊類(lèi)為父類(lèi),新類(lèi)為子類(lèi)。
首先我們來(lái)看下類(lèi)的繼承的基本語(yǔ)法:
class ClassName(BaseClassName):<statement-1>...<statement-N>
在定義類(lèi)的時(shí)候,可以在括號(hào)里寫(xiě)繼承的類(lèi),如果不用繼承類(lèi)的時(shí)候,也要寫(xiě)繼承 object 類(lèi),因?yàn)樵?Python 中 object 類(lèi)是一切類(lèi)的父類(lèi)。
當(dāng)然上面的是單繼承,Python 也是支持多繼承的,具體的語(yǔ)法如下:
class ClassName(Base1,Base2,Base3):<statement-1>...<statement-N>
多繼承有一點(diǎn)需要注意的:若是父類(lèi)中有相同的方法名,而在子類(lèi)使用時(shí)未指定,python 在圓括號(hào)中父類(lèi)的順序,從左至右搜索 , 即方法在子類(lèi)中未找到時(shí),從左到右查找父類(lèi)中是否包含方法。
那么繼承的子類(lèi)可以干什么呢?
繼承的子類(lèi)的好處:
- 會(huì)繼承父類(lèi)的屬性和方法
- 可以自己定義,覆蓋父類(lèi)的屬性和方法
2、調(diào)用父類(lèi)的方法
一個(gè)類(lèi)繼承了父類(lèi)后,可以直接調(diào)用父類(lèi)的方法的,比如下面的例子,UserInfo2
繼承自父類(lèi) UserInfo
,可以直接調(diào)用父類(lèi)的 get_account
方法。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-class UserInfo(object):lv = 5def __init__(self, name, age, account):self.name = nameself._age = ageself.__account = accountdef get_account(self):return self.__accountclass UserInfo2(UserInfo):passif __name__ == '__main__':userInfo2 = UserInfo2('兩點(diǎn)水', 23, 347073565);print(userInfo2.get_account())
3、父類(lèi)方法的重寫(xiě)
當(dāng)然,也可以重寫(xiě)父類(lèi)的方法。
示例:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-class UserInfo(object):lv = 5def __init__(self, name, age, account):self.name = nameself._age = ageself.__account = accountdef get_account(self):return self.__account@classmethoddef get_name(cls):return cls.lv@propertydef get_age(self):return self._ageclass UserInfo2(UserInfo):def __init__(self, name, age, account, sex):super(UserInfo2, self).__init__(name, age, account)self.sex = sex;if __name__ == '__main__':userInfo2 = UserInfo2('兩點(diǎn)水', 23, 347073565, '男');# 打印所有屬性print(dir(userInfo2))# 打印構(gòu)造函數(shù)中的屬性print(userInfo2.__dict__)print(UserInfo2.get_name())
最后打印的結(jié)果:
這里就是重寫(xiě)了父類(lèi)的構(gòu)造函數(shù)。
4、子類(lèi)的類(lèi)型判斷
對(duì)于 class 的繼承關(guān)系來(lái)說(shuō),有些時(shí)候我們需要判斷 class 的類(lèi)型,該怎么辦呢?
可以使用 isinstance()
函數(shù),
一個(gè)例子就能看懂 isinstance()
函數(shù)的用法了。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-class User1(object):passclass User2(User1):passclass User3(User2):passif __name__ == '__main__':user1 = User1()user2 = User2()user3 = User3()# isinstance()就可以告訴我們,一個(gè)對(duì)象是否是某種類(lèi)型print(isinstance(user3, User2))print(isinstance(user3, User1))print(isinstance(user3, User3))# 基本類(lèi)型也可以用isinstance()判斷print(isinstance('兩點(diǎn)水', str))print(isinstance(347073565, int))print(isinstance(347073565, str))
輸出的結(jié)果如下:
True
True
True
True
True
False
可以看到 isinstance()
不僅可以告訴我們,一個(gè)對(duì)象是否是某種類(lèi)型,也可以用于基本類(lèi)型的判斷。