類的繼承
1、定義類的繼承
首先我們來看下類的繼承的基本語法:
class ClassName(BaseClassName): <statement-1> . . . <statement-N>
在定義類的時候,可以在括號里寫繼承的類,一開始也提到過,如果不用繼承類的時候,也要寫繼承 object 類,因為在 Python 中 object 類是一切類的父類。
當然上面的是單繼承,Python 也是支持多繼承的,具體的語法如下:
class ClassName(Base1,Base2,Base3): <statement-1> . . . <statement-N>
多繼承有一點需要注意的:若是父類中有相同的方法名,而在子類使用時未指定,python 在圓括號中父類的順序,從左至右搜索 , 即方法在子類中未找到時,從左到右查找父類中是否包含方法。
那么繼承的子類可以干什么呢?
繼承的子類的好處:
會繼承父類的屬性和方法
可以自己定義,覆蓋父類的屬性和方法
2、調(diào)用父類的方法
一個類繼承了父類后,可以直接調(diào)用父類的方法的,比如下面的例子,UserInfo2 繼承自父類 UserInfo ,可以直接調(diào)用父類的 get_account 方法。
#!/usr/bin/env python # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account class UserInfo2(UserInfo): pass if __name__ == '__main__': userInfo2 = UserInfo2('兩點水', 23, 347073565); print(userInfo2.get_account())
3、父類方法的重寫
當然,也可以重寫父類的方法。
示例:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account @classmethod def get_name(cls): return cls.lv @property def get_age(self): return self._age class UserInfo2(UserInfo): def __init__(self, name, age, account, sex): super(UserInfo2, self).__init__(name, age, account) self.sex = sex; if __name__ == '__main__': userInfo2 = UserInfo2('兩點水', 23, 347073565, '男'); # 打印所有屬性 print(dir(userInfo2)) # 打印構(gòu)造函數(shù)中的屬性 print(userInfo2.__dict__) print(UserInfo2.get_name())
最后打印的結(jié)果:
這里就是重寫了父類的構(gòu)造函數(shù)。
4、子類的類型判斷
對于 class 的繼承關(guān)系來說,有些時候我們需要判斷 class 的類型,該怎么辦呢?
可以使用 isinstance() 函數(shù),
一個例子就能看懂 isinstance() 函數(shù)的用法了。
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User1(object): pass class User2(User1): pass class User3(User2): pass if __name__ == '__main__': user1 = User1() user2 = User2() user3 = User3() # isinstance()就可以告訴我們,一個對象是否是某種類型 print(isinstance(user3, User2)) print(isinstance(user3, User1)) print(isinstance(user3, User3)) # 基本類型也可以用isinstance()判斷 print(isinstance('兩點水', str)) print(isinstance(347073565, int)) print(isinstance(347073565, str))
輸出的結(jié)果如下:
True True True True True False
可以看到 isinstance() 不僅可以告訴我們,一個對象是否是某種類型,也可以用于基本類型的判斷。