學(xué)習(xí):自定義類

轉(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í)例屬性了

參考 https://stackoverflow.com/questions/12949064/python-what-happens-when-class-attribute-instance-attribute-and-method-all-ha

類之間的關(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跪呈,隨后出現(xiàn)的幾起案子段磨,更是在濱河造成了極大的恐慌,老刑警劉巖耗绿,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苹支,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缭乘,警方通過(guò)查閱死者的電腦和手機(jī)沐序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)堕绩,“玉大人策幼,你說(shuō)我怎么就攤上這事∨簦” “怎么了特姐?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)黍氮。 經(jīng)常有香客問(wèn)我唐含,道長(zhǎng),這世上最難降的妖魔是什么沫浆? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任捷枯,我火速辦了婚禮,結(jié)果婚禮上专执,老公的妹妹穿的比我還像新娘淮捆。我一直安慰自己,他們只是感情好本股,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布攀痊。 她就那樣靜靜地躺著,像睡著了一般拄显。 火紅的嫁衣襯著肌膚如雪苟径。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天躬审,我揣著相機(jī)與錄音棘街,去河邊找鬼蟆盐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹬碧,可吹牛的內(nèi)容都是我干的舱禽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恩沽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼誊稚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罗心,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤里伯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渤闷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾瓮,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年飒箭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狼电。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弦蹂,死狀恐怖肩碟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凸椿,我是刑警寧澤髓抑,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布密末,位于F島的核電站新啼,受9級(jí)特大地震影響迷帜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一盯荤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芥玉,春花似錦、人聲如沸饿肺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春蹋绽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爸舒。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蟋字, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扭勉。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓鹊奖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涂炎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忠聚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容