Posted on 2005-10-11 17:01
任我行 閱讀(846)
評論(0) 編輯 收藏 引用 所屬分類:
Python
繼續(xù)Dive Into Python.
20、定義類
以FileInfo類的定義為例
from UserDict import UserDict
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
1)父類放在類名后的小括號內(nèi);
2)類可以有文檔字符串
3)__init__函數(shù)在對象被創(chuàng)建后被自動調(diào)用的第一個函數(shù),可以指定任何個數(shù)的參數(shù)。
4)慣例,__init__應為類中第一個定義的方法,其第一個參數(shù)指向類的當前實例的第一個引用,且應命之為self。__init__中要顯式地調(diào)用父類的__init__方法。
5)__init__無返回值。
6)__init__的定義是可選的,一旦定義必須顯式調(diào)用父類的__init__方法。
7)除了可自由定義的普通的類方法,還有一些可以定義的專用方法。專用方法是在特殊情況下或當使用特別語法時由Python替你調(diào)用的,而不是在代碼中直接調(diào)用(象普通的方法那樣)。也就是說,python提供了一種方法,可以將非方法調(diào)用語法映射到方法調(diào)用上。最常見是__getitem__和__setitem__方法。例如,在上例中增加兩個方法的定義,就可以實現(xiàn)方便的取值和賦值:
def __getitem__(self, key): return self.data[key]
def __setitem__(self, key, item): self.data[key] = item
>f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>f[“name”]
>f[“anothername”]=...
8)__repr__專用函數(shù),返回一個對象的字符串表示。Python用內(nèi)置函數(shù)repr來顯示變量的值,如果repr的參數(shù)是某個對象時,那用它的類的__repr__返回對象的字符串表示。
9)__cmp__專用函數(shù),在比較類實例時被調(diào)用。即當作==比較時,被調(diào)用。
10)__len__專用函數(shù),當調(diào)用內(nèi)置函數(shù)len(instance)時被調(diào)用,對字符串返回字符的個數(shù),對字典返回關(guān)鍵字的個數(shù),對序列或列表返回元素個數(shù)。對自由定義的類,可自由定義返回的len的值的含義。:)
11)__delitem__專用函數(shù), 在調(diào)用 del instance[key]被調(diào)用。
12)__setitem__,__getitem__,__cmp__,__len__,等方法加入到類的定義中后,可以使任何類看起來象“字典”。還有其它的一些專用方法,可以使類看起來象數(shù)值一樣可以對它進行運行。
21、類的實例化和清除
1)象調(diào)用函數(shù)一樣調(diào)用類,就可以實例化一個類,傳入的參數(shù)是__init__定義的參數(shù)(參數(shù)是以從右向左的順序傳遞給__init__的,python會自動添加self),返回一個實例對象。
2)一個類的所有實例,共享類的文檔字符串,
3)python采用引用計數(shù)的技術(shù)進行垃圾回收,因而維護著對第一個創(chuàng)建的實例的引用的列表,當計數(shù)為0時,實例自動被破壞。
4)不用顯式的釋放一個實例,因為當變量超出作用域時自動失效,而至其所對應的實例的引用數(shù)減一。
5)在Python中,你不能子類化象字符串、列表和字典的內(nèi)置數(shù)據(jù)類型。作為補償,Python附帶了封裝類,可以模擬這些內(nèi)置的數(shù)據(jù)類型的行為: UserString,UserList,和 UserDict。
6)子類中定義的方法覆蓋父類的方法,python不支持函數(shù)重載。由此,子類的__init__與父類的__init__的參數(shù)序列可以有較大的不同。
7)python支持數(shù)據(jù)屬性,即C++中所謂的“數(shù)據(jù)成員”,對其值的引用需要以"實例名.屬性名"的方式。注意,數(shù)據(jù)屬性是類實例擁有的屬性,還有一種屬性是叫屬性,是類所擁有的
8)
22、當:號后面的塊(即需要縮進的內(nèi)容)只有一條語句時,可以直接將此語句放在:后面。