類(lèi)
1、定義類(lèi)
類(lèi)定義語(yǔ)法格式如下:
class ClassName: <statement-1> . . . <statement-N>
一個(gè)類(lèi)也是由屬性和方法組成的,有些時(shí)候我們定義類(lèi)的時(shí)候需要設(shè)置類(lèi)的屬性,因此這就需要構(gòu)造函
類(lèi)的構(gòu)造函數(shù)如下:
def __init__(self,[...):
類(lèi)定義了 init() 方法的話,類(lèi)的實(shí)例化操作會(huì)自動(dòng)調(diào)用 init() 方法。
那么如構(gòu)造函數(shù)相對(duì)應(yīng)的是析構(gòu)函數(shù),理所當(dāng)然,一個(gè)類(lèi)創(chuàng)建的時(shí)候我們可以用過(guò)構(gòu)造函數(shù)設(shè)置屬性,那么當(dāng)一個(gè)類(lèi)銷(xiāo)毀的時(shí)候,就會(huì)調(diào)用析構(gòu)函數(shù)。
析構(gòu)函數(shù)語(yǔ)法如下:
def __del__(self,[...):
仔細(xì)觀察的童鞋都會(huì)發(fā)現(xiàn),類(lèi)的方法與普通的函數(shù)有一個(gè)特別的區(qū)別,它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱(chēng), 按照慣例它的名稱(chēng)是 self。
那么這個(gè) self 代表什么呢?
我們可以看下實(shí)例,通過(guò)實(shí)例來(lái)找出答案:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
觀察輸出的結(jié)果:
從執(zhí)行結(jié)果可以很明顯的看出,self 代表的是類(lèi)的實(shí)例,輸出的是當(dāng)前對(duì)象的地址,而 self.__class__ 則指向類(lèi)。
當(dāng)然 self 不是 python 關(guān)鍵字,也就是說(shuō)我們把他換成其他的字符也是可以正常執(zhí)行的。只不過(guò)我們習(xí)慣使用 self
2、Python 定義類(lèi)的歷史遺留問(wèn)題
Python 在版本的迭代中,有一個(gè)關(guān)于類(lèi)的歷史遺留問(wèn)題,就是新式類(lèi)和舊式類(lèi)的問(wèn)題,具體先看以下的代碼:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 舊式類(lèi) class OldClass: pass # 新式類(lèi) class NewClass(object): pass
可以看到,這里使用了兩者中不同的方式定義類(lèi),可以看到最大的不同就是,新式類(lèi)繼承了object 類(lèi),在 Python2 中,我們定義類(lèi)的時(shí)候最好定義新式類(lèi),當(dāng)然在 Python3 中不存在這個(gè)問(wèn)題了,因?yàn)?Python3 中所有類(lèi)都是新式類(lèi)。
那么新式類(lèi)和舊式類(lèi)有什么區(qū)別呢?
運(yùn)行下下面的那段代碼:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 舊式類(lèi) class OldClass: def __init__(self, account, name): self.account = account; self.name = name; # 新式類(lèi) class NewClass(object): def __init__(self, account, name): self.account = account; self.name = name; if __name__ == '__main__': old_class = OldClass(111111, 'OldClass') print(old_class) print(type(old_class)) print(dir(old_class)) print('\n') new_class=NewClass(222222,'NewClass') print(new_class) print(type(new_class)) print(dir(new_class))
仔細(xì)觀察輸出的結(jié)果,對(duì)比一下,就能觀察出來(lái),注意喔,Pyhton3 中輸出的結(jié)果是一模一樣的,因?yàn)镻ython3 中沒(méi)有新式類(lèi)舊式類(lèi)的問(wèn)題。