類別
1、定義類別
類別定義語法格式如下:
class ClassName: <statement-1> . . . <statement-N>
一個類別也是由屬性和方法組成的,有些時候我們定義類別的時候需要設定類別的屬性,因此這就需要建構函
類別的建構子如下:
def __init__(self,[...):
類別定義了init() 方法的話,類別的實例化操作會自動調用init() 方法。
那麼如建構函數相對應的是析構函數,理所當然,一個類別創建的時候我們可以用過建構函數來設定屬性,那麼當一個類別銷毀的時候,就會呼叫析構函數。
析構函數語法如下:
def __del__(self,[...):
仔細觀察的童鞋都會發現,類別的方法與普通的函數有一個特別的區別,它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是self。
那麼這個 self 代表什麼呢?
我們可以看下實例,透過實例來找出答案:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
觀察輸出的結果:
從執行結果可以很明顯的看出, self 代表的是類別的實例,輸出的是目前物件的位址,而self.__class__ 則指向類別。
當然 self 不是 python 關鍵字,也就是說我們把他換成其他的字元也是可以正常執行的。只不過我們習慣使用self
2、Python 定義類別的歷史遺留問題
Python 在版本的迭代中,有一個關於類的歷史遺留問題,就是新式類別和舊式類別的問題,具體先看以下的程式碼:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 旧式类 class OldClass: pass # 新式类 class NewClass(object): pass
可以看到,這裡使用了兩者中不同的方式定義類,可以看到最大的不同就是,新式類別繼承了object 類,在Python2 中,我們定義類別的時候最好定義新式類,當然在Python3 中不存在這個問題了,因為Python3 中所有類別都是新式類別。
那麼新式類別和舊式類別有什麼差別呢?
運行下下面的那段程式碼:
#!/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))
仔細觀察輸出的結果,比較一下,就能觀察出來,注意喔,Pyhton3 中輸出的結果是一模一樣的,因為Python3 中沒有新式類舊式類別的問題。