類即對象,就像哺乳動物,屬性是可以遺傳的,這點就是類的繼承
兒子相對父親,就像是子類相對父類,子類有父類的全部屬性,而且子類也可以重新定義自己的屬性值,來覆蓋父類的屬性值
當我們定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱為子類,而被繼承的class稱為基類、父類。
如下示例代碼:
class a():
def run(self):
print('a class...')
class b(a):
def run(self):
print('b class...')
class c(a):
def hello(self):
print('hello c')
- 首先定義一個a類,里面有一個run()方法
- 然后定義一個b類,繼承與a類,而且里面有一個和a類一樣的方法run,且會覆蓋a的run方法
- 再定義一個c類,同樣繼承a類,但是并未重寫run方法,而是重新定義一個新的方法hello
下面來初始化類的值,以及使用函數(shù)名看看情況
ac = a()
bc = b()
cc = c()
ac.run()
# 結(jié)果:a class...
bc.run()
# 結(jié)果:b class...
cc.run()
# 結(jié)果:a class...
cc.hello()
# 結(jié)果:hello c
從上面結(jié)果看,可以得到如下結(jié)論:
- ac打印是
a class...
,正是a類中定義的輸出 - bc打印是
b class...
,說明b的重新定義run并覆蓋了父類的run方法 - cc打印是
a class...
,c并沒有定義run,它的run方法是從父類a里面繼承過來的,自己定義了hello方法
繼承:子類從繼承的父類中,得到父類的全部屬性和方法
接下來就是類的特性——多態(tài)
多態(tài),意思就是多種形態(tài),這里用動物來作比較最合適
首先定義一個動物的父類:
class Animal():
def get_type(self):
print("Animal...")
然后定義一個猴子類,繼承動物:
class Monkey(Animal):
def get_type(self):
print("Monkey...")
再定義一個小白鼠類,繼承動物:
class Mouse(Animal):
def get_type(self):
print("Mouse...")
接著定義一個人類,繼承猴子:
class People(Monkey):
def get_type(self):
print("People...")
定義好三個類之后,然后定義一個適用動物類的函數(shù):
def get_animal(animal):
animal.get_type()
get_animal函數(shù)接收一個動物類的對象參數(shù),然后運行它的get_type()方法
最后實例化剛才定義的所有類,然后調(diào)用get_animal函數(shù)看看
animal = Animal()
monkey = Monkey()
mouse = Mouse()
people = People()
get_animal(animal)
# 結(jié)果:Animal...
get_animal(monkey)
# 結(jié)果:Monkey...
get_animal(mouse)
# 結(jié)果:Mouse...
get_animal(people)
# 結(jié)果:People...
以上代碼就是檢測類的多態(tài)。都是基于同一個父類,所以肯定有父類的方法,但此時他們不再是父類或者是同一種類,而是各種形態(tài)的類。
這也就是類的多態(tài)性【有點萬變不離其宗的意思】
一個小白肯定會問的小問題:定義一個類,括號內(nèi)有的是空,有的是放入父類。我記得每個類都會繼承object類,為什么有的可以寫空呢?
答:python3隱式繼承了object,所以python3中寫不寫繼承object都是沒有區(qū)別的 。【不過在Python2.x是有區(qū)別的】
Python3教程--傳送門