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