Python類(lèi)(4)類(lèi)的繼承
類(lèi)的繼承格式
class 子類(lèi)(基類(lèi)):
pass
基類(lèi)(父類(lèi)): 被繼承者(先輩)
子類(lèi):繼承者(后輩)
如果沒(méi)有基類(lèi),就用object
比如,我們前面幾節(jié)課的內(nèi)容,都是直接繼承自object這個(gè)基類(lèi)的.理論上,所有的類(lèi)都是object的子類(lèi)
可以用base屬性查看子類(lèi)的父類(lèi)
查看子類(lèi)的父類(lèi)
class 子類(lèi)(object):
pass
print(子類(lèi).__base__)
輸出:

在這里插入圖片描述
查看子類(lèi)的父類(lèi)的第二個(gè)示例
class 子類(lèi)(object):
pass
class 孫子類(lèi)(子類(lèi)):
pass
print(孫子類(lèi).__base__)
輸出:

在這里插入圖片描述
除了這樣的單繼承之外,還可以多繼承
多繼承寫(xiě)法:
class 子類(lèi)(父類(lèi),母類(lèi)):
pass
這里只是舉了個(gè)例子,有兩個(gè)父類(lèi),也可以是三個(gè),四個(gè),五個(gè)
這里不再舉例了,有興趣的同學(xué)可以自行嘗試
繼承了什么
繼承的目的有2個(gè):
- 繼往
- 開(kāi)來(lái)
繼往:就是原來(lái)有的,我都有
開(kāi)來(lái):就是原來(lái)沒(méi)有的,我也可以有
繼承的基本使用:
class A(object):
def __init__(self):
self.name = "張三"
def move(self):
print("我可以移動(dòng)")
def swim(self):
print("游泳我也會(huì)哦")
class B(A):
def __init__(self):
super().__init__()
self.age = 10
def jump(self):
print("我還可以跳")
def move(self):
print("我的移動(dòng)是飛哦")
b = B()
print(b.name)
print(b.age)
b.move()
b.jump()
b.swim()
在這里插入圖片描述
代碼分析:
A:是基類(lèi)
B:是子類(lèi)
A有一個(gè)實(shí)例屬性name, 兩個(gè)實(shí)例方法move(), swim()
B繼承自A,自建了一個(gè)實(shí)例屬性age, 一個(gè)實(shí)例方法jump(),改寫(xiě)了move()方法
從效果圖可以看出來(lái)
b有name屬性, 有age屬笥
b的jump(),swim()方法
但是move()方法與A中自的那個(gè)move()方法是不一樣的.這個(gè)過(guò)程稱(chēng)為重寫(xiě)(重載)
總結(jié)
- 子類(lèi)繼承父類(lèi)時(shí),父類(lèi)可以有一個(gè)或多個(gè)
- 子類(lèi)繼承父類(lèi)時(shí),會(huì)把父類(lèi)的實(shí)例屬性,實(shí)例方法都繼承過(guò)來(lái)
- 子類(lèi)如果對(duì)父類(lèi)的行為(方法)不習(xí)慣,可以選擇改良(重寫(xiě))
- 子類(lèi)如果有構(gòu)造函數(shù),父類(lèi)的構(gòu)造函數(shù)將不會(huì)被自動(dòng)調(diào)用,需要手動(dòng)調(diào)用super().init()
- 如果子類(lèi)有多個(gè)父類(lèi),在使用super().init()方法調(diào)用父類(lèi)的構(gòu)造函數(shù)時(shí),會(huì)按照父類(lèi)的順序調(diào)用第一個(gè)有構(gòu)造函數(shù)的父類(lèi)的構(gòu)造函數(shù).
- 子類(lèi)可以對(duì)父類(lèi)沒(méi)有想到的東西加以添加(子類(lèi)可以新增屬性,方法)