轉(zhuǎn)自:http://www.byhy.net/tut/py/basic/18/
什么是類
Python 中的一切對(duì)象都有各自的類型梯浪,比如
整數(shù)對(duì)象 的類型是 int
字符串對(duì)象 的類型是 str
列表對(duì)象 的類型是 list
元組對(duì)象 的類型是 tuple
字典對(duì)象 的類型是 dict
Python 的內(nèi)置函數(shù)type可以查看對(duì)象的類型
>>> type(12)
<class 'int'> # 整數(shù)類型
>>> type('12')
<class 'str'> # 字符類型
>>> type([1,2])
<class 'list'> # 列表類型
>>> type((1,2))
<class 'tuple'> # 元組類型
>>> type({1:2})
<class 'dict'> # 字典類型
我們掌握了這些內(nèi)置的數(shù)據(jù)類型巷疼,通常就可以開發(fā)Python程序了鲸阔。
但是當(dāng)我們要開發(fā)的軟件系統(tǒng) 更加復(fù)雜的時(shí)候鹉究,尤其是系統(tǒng)里面的對(duì)象 和現(xiàn)實(shí)世界的對(duì)象 存在對(duì)應(yīng)關(guān)系的時(shí)候戒努,如果只能用這些內(nèi)置類型,就會(huì)感覺(jué)很不方便了。
比如,我們的程序要表示一個(gè) 奔馳汽車
這樣的對(duì)象類型对人,屬性有:品牌,國(guó)家拂共,價(jià)格牺弄。
如果只用Python的內(nèi)置類型,大家想想怎么表示 宜狐。
當(dāng)然势告,我們可以定義一個(gè)字典類型的對(duì)象,比如
benzCar = {
'brand' : '奔馳',
'country' : '德國(guó)',
'price' : 300000
}
如果這個(gè)汽車對(duì)象還需要有自己特定的行為抚恒,比如 按喇叭會(huì)發(fā)出嘟嘟的聲音咱台。那又該怎么定義呢?
有人說(shuō)俭驮,可以定義一個(gè)函數(shù)對(duì)象作為它的屬性回溺,像這樣
def pressHorn():
print('嘟嘟~~~~~~')
benzCar = {
'brand' : '奔馳',
'country' : '德國(guó)',
'price' : 300000,
'pressHorn' : pressHorn # 字典對(duì)象的值可以是一個(gè)函數(shù)對(duì)象
}
# 我可以這樣執(zhí)行它的行為
benzCar['pressHorn']()
似乎也可以。
但是這里 benzCar
更像是一個(gè)具體的對(duì)象表鳍,并不是一種 對(duì)象類型
馅而。
而且 這個(gè) benzCar
汽車的 行為的定義 ,要在外面定義一個(gè)函數(shù)譬圣, 然后benzCar
字典的內(nèi)部去引用它瓮恭,這樣也比較麻煩。
為了解決這樣的普遍問(wèn)題厘熟,Python語(yǔ)言可以讓我們 自己定義對(duì)象類型
屯蹦。
Python中自定義對(duì)象類型维哈,就是 定義一個(gè)類
, 類
就是 類型
的意思登澜。
比如 : 奔馳汽車阔挠, 可以這樣定義
class BenzCar:
brand = '奔馳' # 品牌屬性
country = '德國(guó)' # 產(chǎn)地屬性
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
定義一個(gè)類 用關(guān)鍵字 class
后面加 類的名稱。
類名的規(guī)范 和 變量命名規(guī)范一樣脑蠕。 通常我們會(huì)把類名 首字母大寫购撼, 這里定義的類名就是 BenzCar
下面定義的 brand, country 都是 BenzCar 類的 屬性
。
這種屬性被稱為類屬性
如果我們要得到屬性的值可以這樣用 類名.屬性名
的方式谴仙,如下
print(BenzCar.brand)
而 pressHorn 則是該類型的一個(gè) 方法
迂求。 請(qǐng)注意上面的 @staticmethod
的修飾, 說(shuō)明這是該類的一個(gè) 靜態(tài)方法
要調(diào)用執(zhí)行該類的靜態(tài)方法晃跺,像這樣就可以了
BenzCar.pressHorn()
大家可以拷貝如下代碼到一個(gè)文件中揩局,執(zhí)行一下看看
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
BenzCar.pressHorn()
類的實(shí)例
點(diǎn)擊這里,邊看視頻講解掀虎,邊學(xué)習(xí)以下內(nèi)容
類和實(shí)例的關(guān)系
Python中 類 是 某種對(duì)象的類型凌盯。
比如 int 是 整數(shù)對(duì)象的類型, str是字符串對(duì)象的類型烹玉, list是 列表對(duì)象的類型驰怎。
我們把一個(gè)個(gè)具體的 對(duì)象稱為 該類型的 實(shí)例
,
比如春霍,我們可以說(shuō)
數(shù)字對(duì)象 3 是 int 類型的的實(shí)例砸西,具有int類型的特征
字符串對(duì)象 ‘a(chǎn)bc’ 是 str 類型的實(shí)例,具有str類型的特性(比如可以執(zhí)行str的所有方法址儒,比如 find芹枷, split等)
列表對(duì)象 [1,2,3] 是 list 類型的的實(shí)例,具有l(wèi)ist類型的特性(比如可以執(zhí)行l(wèi)ist的所有方法莲趣,比如 reverse鸳慈,append等)
同樣的,我們自定義的類喧伞,也可以產(chǎn)生該類的實(shí)例對(duì)象走芋。 每個(gè)實(shí)例對(duì)象就是該類的一個(gè)實(shí)例,具有該類的一切特征潘鲫。
要產(chǎn)生一個(gè)類的實(shí)例對(duì)象翁逞,只需要 在類名后面加上括號(hào)
,就可以了溉仑,就會(huì)返回一個(gè)該類的實(shí)例對(duì)象挖函。
比如
car1 = BenzCar()
car1 變量就對(duì)應(yīng)了一個(gè) BenzCar 類型 的實(shí)例對(duì)象,具有 BenzCar 類的一切屬性和方法浊竟。大家可以執(zhí)行下面的代碼試試怨喘。
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
car1 = BenzCar()
print(car1.brand)
car1.pressHorn()
同樣津畸,我們也可以用 type 函數(shù)查看 car1 這個(gè)實(shí)例的類型,如下所示
>>> type(car1)
<class '__main__.BenzCar'>
說(shuō)明 car1 是 __main__
模塊里面定義的 BenzCar 類型必怜。
大家一定要搞清楚 類 和 實(shí)例 的關(guān)系肉拓。
比如 :
人 就是 一個(gè) 類, 而 關(guān)羽梳庆、張飛 就是 人 這個(gè)類的 具體實(shí)例暖途。
狗 也是 一個(gè) 類, 而 你們家的阿黃 和 隔壁家的旺財(cái) 就是狗 這個(gè)類的 具體實(shí)例靠益。丧肴。
Python中 定義一個(gè)類型 就是描述 這些類型的實(shí)例的 公共特征
残揉。后面根據(jù)這個(gè)類創(chuàng)建的實(shí)例 都具有這個(gè)類的 特征胧后,就是 具體什么 屬性、方法抱环。
實(shí)例屬性和實(shí)例方法
點(diǎn)擊這里壳快,邊看視頻講解,邊學(xué)習(xí)以下內(nèi)容
剛才我們定義的類里面的屬性都是 類屬性
镇草,里面的方法都是類的 靜態(tài)方法
眶痰。
所有BenzCar類的實(shí)例對(duì)象,其 品牌名 brand
梯啤,對(duì)應(yīng)的類屬性應(yīng)該是相同的竖伯。
就是說(shuō)下面這樣的兩個(gè)實(shí)例
car1 = BenzCar()
car2 = BenzCar()
car1 和 car2 的 brand屬性 都是一樣的 值, 都是字符串 ‘奔馳’
很好理解因宇,因?yàn)槠放七@樣的屬性 對(duì)于所有的 奔馳車都是一樣的七婴,都是 ‘奔馳’。
類屬性
是類的共同特征屬性察滑。
但是有些屬性打厘,比如顏色、發(fā)動(dòng)機(jī)編號(hào) 是每一輛奔馳車 都不同的贺辰。
所以户盯,在我們定義的 類BenzCar 里面, 顏色饲化、發(fā)動(dòng)機(jī)編號(hào) 是 不應(yīng)該 作為類屬性的莽鸭。
每個(gè)實(shí)例獨(dú)有的屬性,稱之為 類的實(shí)例屬性
實(shí)例屬性通常是在類的 初始化方法 __init__
里面定義的吃靠。
比如:
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
# 初始化方法, 注意前后各有兩個(gè)下劃線
def __init__(self):
self.color = 'red' # 顏色
self.engineSN = '837873398' # 發(fā)動(dòng)機(jī)編號(hào)
上面的初始化方法 __init__
硫眨,就創(chuàng)建了兩個(gè)實(shí)例屬性 color 和 engineSN。
為什么 __init__
方法 叫初始化方法呢撩笆?
解釋器在執(zhí)行 像下面這樣的 實(shí)例化類對(duì)象 的代碼時(shí)捺球,
car1 = BenzCar()
首先缸浦,解釋器會(huì) 在內(nèi)存中
創(chuàng)建一個(gè)該類 的 實(shí)例對(duì)象;
然后氮兵,解釋器會(huì)查看這個(gè)類是否有 __init__
方法裂逐,如果有,就會(huì)去調(diào)用它泣栈。
__init__
是 創(chuàng)建好實(shí)例后 立即就要 執(zhí)行 的方法卜高,所以稱之為初始化方法。
通常我們會(huì)在__init__
方法里面 執(zhí)行一些初始化的動(dòng)作南片,主要就是創(chuàng)建該實(shí)例的 實(shí)例屬性掺涛。
__init__
方法的第一個(gè)參數(shù)是 self
, 它 是干什么用的呢疼进?
剛才說(shuō)了薪缆, 解釋器執(zhí)行實(shí)例化代碼,會(huì)先在內(nèi)存中創(chuàng)建該類實(shí)例對(duì)象伞广,然后調(diào)用類 的__init__
方法拣帽。
調(diào)用 __init__
方法時(shí),就將實(shí)例對(duì)象 傳遞給 self參數(shù)嚼锄。
self 參數(shù)變量 指向的 就是 實(shí)例對(duì)象 本身减拭, 所以下面的代碼就是創(chuàng)建該實(shí)例的屬性color 和 engineSN 了
self.color = 'red' # 顏色
self.engineSN = '8378738398' # 發(fā)動(dòng)機(jī)編號(hào)
類的靜態(tài)方法要在方法定義 上面加上 @staticmethod
的修飾。
而 類的 實(shí)例方法
不需要任何修飾区丑。
通常類的實(shí)例方法拧粪,都是要 訪問(wèn)類的實(shí)例屬性的。 包括: 創(chuàng)建沧侥、修改可霎、刪除 類的實(shí)例屬性。
因?yàn)?實(shí)例方法 就是要操作 實(shí)例獨(dú)有的屬性正什,否則不操作任何實(shí)例屬性的話啥纸,就應(yīng)該定義為 類方法。
比如 __init__
初始化方法婴氮,就是一個(gè)實(shí)例方法斯棒,它通常要?jiǎng)?chuàng)建一些實(shí)例屬性。
而 pressHorn
方法是類的靜態(tài)方法主经, 靜態(tài)方法是不能訪問(wèn)實(shí)例屬性的
荣暮。
有時(shí)候,實(shí)例屬性的取值罩驻,不是固定寫在初始化方法的代碼里面穗酥。
比如這里,每輛車的顏色、發(fā)動(dòng)機(jī)號(hào)都是不同的砾跃,我們應(yīng)該作為參數(shù)傳進(jìn)去骏啰。
所以修改代碼為這樣
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
def __init__(self,color,engineSN):
self.color = color # 顏色
self.engineSN = engineSN # 發(fā)動(dòng)機(jī)編號(hào)
這樣我們?cè)趧?chuàng)建實(shí)例的時(shí)候疑苫,就可以根據(jù)需要指定不同的實(shí)例屬性了睦疫,比如
car1 = BenzCar('白色','24503425527866')
car2 = BenzCar('黑色','34598423586877')
print(car1.color)
print(car2.color)
print(car1.engineSN)
print(car2.engineSN)
雖然定義的時(shí)候, __init__
方法 有3個(gè)參數(shù) : self,color,engineSN
但是我們這樣調(diào)用 BenzCar()
實(shí)例化的時(shí)候寻馏, 只需要傳入后面兩個(gè)參數(shù)即可翘骂。
因?yàn)閟elf 參數(shù) 需要傳入實(shí)例對(duì)象本身壁熄,解釋器會(huì)自動(dòng)幫我們傳入。
其它的 實(shí)例方法也是這樣碳竟, 比如我們定義一個(gè) 修改車身顏色的方法 changeColor
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
def __init__(self,color,engineSN):
self.color = color # 顏色
self.engineSN = engineSN # 發(fā)動(dòng)機(jī)編號(hào)
def changeColor(self,newColor):
self.color = newColor
car1 = BenzCar('白色','24503425527866')
car1.changeColor('黑色')
print (car1.color)
調(diào)用 changeColor
方法的時(shí)候草丧,只需要傳入?yún)?shù) newColor
對(duì)應(yīng)新的顏色即可。
不需要我們傳入self參數(shù)莹桅,self 參數(shù)是實(shí)例對(duì)象本身昌执,解釋器會(huì)自動(dòng)幫我們傳入。
注意: 如果你的實(shí)例屬性名稱 和 靜態(tài)屬性 重復(fù)了
统翩,通過(guò)類實(shí)例訪問(wèn)該屬性仙蚜,訪問(wèn)的是實(shí)例屬性。通過(guò)類名訪問(wèn)該屬性厂汗,訪問(wèn)的是類屬性。
比如
class Car:
brand = '奔馳'
name = 'Car'
def __init__(self):
# 可以通過(guò)實(shí)例訪問(wèn)到類屬性
print(self.brand)
# 定義實(shí)例屬性和類屬性重名
self.name = 'benz car'
c1 = Car()
print(f'通過(guò)實(shí)例名訪問(wèn)name:{c1.name}')
print(f'通過(guò)類名 訪問(wèn)name:{Car.name}')
一旦創(chuàng)建了 和類屬性同名的 實(shí)例屬性呜师,通過(guò)實(shí)例訪問(wèn)的就是實(shí)例屬性了
類之間的關(guān)系
繼承關(guān)系
點(diǎn)擊這里娶桦,邊看視頻講解,邊學(xué)習(xí)以下內(nèi)容
真實(shí)世界中汁汗,類型之間 可能存在 范圍 包含
關(guān)系衷畦。
比如:人
這個(gè)類型 和 亞洲人
這個(gè)類型。
人
是包括了 亞洲人
的知牌。 如果 某人 是一個(gè) 亞洲人
祈争,那么它必定是一個(gè) 人
。
這種關(guān)系角寸,編程語(yǔ)言中稱之為 繼承關(guān)系
菩混。
比如上面的例子, 亞洲人
這個(gè)類 就 繼承
了 人
這個(gè)類扁藕。
通常我們把被繼承的類稱之為 父類
或者叫 基類
把繼承類稱之為 子類
或者 派生類
沮峡。
同樣的,以車為例亿柑, 上面我們定義了奔馳車 這個(gè)類邢疙, 我們還可以定義兩個(gè) 子類: 奔馳2016
和 奔馳2018
對(duì)應(yīng)兩種不同款的奔馳車。
如下所示:
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
@staticmethod
def pressHorn():
print('嘟嘟~~~~~~')
def __init__(self,color,engineSN):
self.color = color # 顏色
self.engineSN = engineSN # 發(fā)動(dòng)機(jī)編號(hào)
def changeColor(self,newColor):
self.color = newColor
class Benz2016(BenzCar):
price = 580000
model = 'Benz2016'
class Benz2018(BenzCar):
price = 880000
model = 'Benz2018'
大家可以發(fā)現(xiàn)定義子類的時(shí)候,必須指定它的父類是什么疟游。
指定的方法就是在類名的后面的括號(hào)里寫上父類的名字呼畸。
大家注意: 子類會(huì)自動(dòng)擁有父類的一切屬性和方法
為什么? 因?yàn)橐粋€(gè)子類的實(shí)例對(duì)象 颁虐,必定也是一個(gè)父類的實(shí)例對(duì)象役耕。 當(dāng)然需要擁有父類的一切屬性和方法。
就像 一個(gè)亞洲人
當(dāng)然 擁有一個(gè) 人
所應(yīng)該具有的一切特性聪廉。
比如瞬痘,執(zhí)行下面的代碼
car1 = Benz2016('red','234234545622')
car2 = Benz2018('blue','111135545988')
print (car1.brand)
print (car1.country)
car1.changeColor('black')
print (car2.brand)
print (car2.country)
car2.pressHorn()
輸出結(jié)果如下
奔馳
德國(guó)
奔馳
德國(guó)
嘟嘟~~~~~~
一個(gè)子類在繼承父類的一切特性的基礎(chǔ)上,可以有自己的屬性和方法板熊。 比如:
class Benz2018(BenzCar):
price = 880000
model = 'Benz2018'
def __init__(self,color,engineSN,weight):
# 先調(diào)用父類的初始化方法
BenzCar.__init__(self,color,engineSN)
self.weight = weight # 車的重量
self.oilweight = 0 # 油的重量
# 加油
def fillOil(self, oilAdded):
self.oilweight += oilAdded
self.weight += oilAdded
這里 子類 Benz2018 框全,新增了兩個(gè) 類屬性
價(jià)格: price
型號(hào): model
新增了兩個(gè)實(shí)例屬性
整車重量:weight
油的重量:oilweight
新增了一個(gè)實(shí)例方法 fillOil
, 對(duì)應(yīng) 加油這個(gè)行為干签。
這個(gè)行為會(huì)導(dǎo)致 實(shí)例屬性 weight 和 oilweight 變化津辩,所以必須是 實(shí)例方法。
這樣定義好了以后容劳, 就可以創(chuàng)建該類的實(shí)例喘沿,并訪問(wèn)其新的方法和屬性了。
car2 = Benz2018('blue','111135545988',1500)
print (car2.oilweight)
print (car2.weight)
car2.fillOil(50)
print (car2.oilweight)
print (car2.weight)
要特別注意的是竭贩, 子類的初始化方法里面蚜印,如果有一部分的初始化代碼和父類的初始化相同(通常都是這樣),需要顯式的 調(diào)用父類的初始化方法 __init__
而且要傳入相應(yīng)的參數(shù)留量, 像上面那樣窄赋,然后可以加上自己的特有的初始化代碼。如下所示
def __init__(self,color,engineSN,weight):
# 先調(diào)用父類的初始化方法
BenzCar.__init__(self,color,engineSN)
self.weight = weight
self.oilweight = 0
如果子類 沒(méi)有
自己的初始化方法楼熄,實(shí)例化子類對(duì)象時(shí)忆绰,解釋器會(huì)自動(dòng)調(diào)用父類初始化方法,如下
class Rect:
def __init__(self):
print('初始化 rect')
class Squre(Rect):
pass
s = Squre()
運(yùn)行結(jié)果可岂,會(huì)打印出 初始化 rect
但是错敢,如果子類 有自己
的初始化方法,實(shí)例化子類對(duì)象時(shí)缕粹,解釋器就不會(huì)自動(dòng)化調(diào)用父類的初始化方法稚茅,如下
class Rect:
def __init__(self):
print('初始化 rect')
class Square(Rect):
def __init__(self):
print('初始化 square')
s = Squre()
運(yùn)行結(jié)果只會(huì)打印 初始化 square
。
調(diào)用父類的方法致开,除了直接用父類的名字 BenzCar峰锁, 還可以使用 函數(shù) super()
像這樣
def __init__(self,color,engineSN,weight):
# 同樣是調(diào)用父類的初始化方法
super().__init__(color, engineSN)
self.weight = weight
self.oilweight = 0
這樣使用的時(shí)候,方法參數(shù)中 不需要加上 self 參數(shù)双戳。
使用super的好處之一就是:子類中調(diào)用父類的方法虹蒋,不需要 顯式指定 父類的名字。 代碼的可維護(hù)性更好。
想象一下魄衅,如果BenzCar有很多子類峭竣,如果那一天BenzCar類改了名字,采用super這樣的寫法晃虫,就不需要修改子類的代碼了皆撩。
另外一個(gè)更重要的好處是,在多重繼承的情況哲银,super能有效的保證繼承鏈上的方法被正確調(diào)用到扛吞,感興趣的朋友可以參考stack overflow上的闡述 , 和 這里的官方文檔
注意 super不僅僅可以調(diào)用父類的初始化方法荆责,也可以調(diào)用父類的其他方法滥比。
一個(gè)子類,同時(shí)還可以是另一個(gè)類的父類做院。
比如 亞洲人
可以是 人
的子類盲泛, 同時(shí)可以是 中國(guó)人
的父類。
因?yàn)橐粋€(gè)中國(guó)人键耕,一定是一個(gè)亞洲人寺滚, 當(dāng)然也一定是一個(gè) 人 。
同樣的屈雄,上面的車的例子村视, 我們還可以定義 奔馳2018混合動(dòng)力
作為 奔馳2018
的 子類。
定義的語(yǔ)法還是一樣的
class Benz2018Hybrid(Benz2018):
model = 'Benz2018Hybrid'
price = 980000
def __init__(self,color,engineSN,weight):
Benz2018.__init__(self,color,engineSN,weight)
同樣棚亩,類 Benz2018Hybrid 也會(huì)擁有其父類 Benz2018 的一切屬性和方法蓖议,自然也包括 父類的父類 BenzCar 的一切屬性和方法
car2 = Benz2018Hybrid('blue','111135545988',1500)
print (car2.oilweight)
print (car2.weight)
car2.fillOil(50)
print (car2.oilweight)
print (car2.weight)
類的組合關(guān)系
點(diǎn)擊這里,邊看視頻講解讥蟆,邊學(xué)習(xí)以下內(nèi)容
除了上面的繼承關(guān)系, 類之間還有一種常見(jiàn)的組合關(guān)系纺阔。
所謂組合關(guān)系瘸彤,就是一個(gè)類實(shí)例的屬性里面包含另外一個(gè)類實(shí)例。
比如
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
def __init__(self,color,engineSN):
self.color = color # 顏色
self.engineSN = engineSN # 發(fā)動(dòng)機(jī)編號(hào)
這樣的定義笛钝,類 BenzCar 中
brand 屬性就是一個(gè)字符串對(duì)象 奔馳
country 屬性就是一個(gè)字符串對(duì)象 德國(guó)
而該類的實(shí)例對(duì)象中质况,就包含了 兩個(gè)屬性 color 和 engineSN, 都是字符串對(duì)象
我們可以說(shuō) 該類由 一些字符串對(duì)象 組合
而成玻靡。
甚至還可以包含 我們自己定義的類的實(shí)例结榄,比如:
# 輪胎
class Tire:
def __init__(self,size,createDate):
self.size = size # 尺寸
self.createDate = createDate # 出廠日期
class BenzCar:
brand = '奔馳'
country = '德國(guó)'
def __init__(self,color,engineSN,tires):
self.color = color # 顏色
self.engineSN = engineSN # 發(fā)動(dòng)機(jī)編號(hào)
self.tires = tires
# 創(chuàng)建4個(gè)輪胎實(shí)例對(duì)象
tires = [Tire(20,'20160808') for i in range(4)]
car = BenzCar('red','234342342342566',tires)
上面的例子里,奔馳汽車對(duì)象就 包含
了4個(gè)輪胎 Tire
對(duì)象囤捻。
我們可以說(shuō)奔馳汽車對(duì)象是由 4個(gè)輪胎對(duì)象 組合
而成臼朗,形成了對(duì)象的組合關(guān)系。
對(duì)象的 屬性
變量 保存了 組合它的那些對(duì)象。
組合關(guān)系视哑,可以通過(guò)上層對(duì)象的屬性一步的訪問(wèn)到內(nèi)部對(duì)象的屬性
比如绣否,我們可以通過(guò) BenzCar 對(duì)象 訪問(wèn)其內(nèi)部的輪胎對(duì)象
print(car.tires[0].size)
Python解釋器對(duì)這個(gè)表達(dá)式 car.tires[0].size
是從左到右依次執(zhí)行的,如下所示
car.tires # BenzCar實(shí)例的tires屬性挡毅,得到一個(gè)列表蒜撮,里面是四個(gè) Tire 實(shí)例對(duì)象
car.tires[0] # 得到BenzCar實(shí)例的tires屬性列表里面的第1個(gè)Tire 實(shí)例對(duì)象
car.tires[0].size # 得到BenzCar實(shí)例的tires屬性列表里面的第1個(gè)Tire 實(shí)例對(duì)象的size屬性
十萬(wàn)分感謝白月黑羽平臺(tái)