除了實現(xiàn)新的種類的對象以外,類有時有用于擴展Python的內(nèi)置類型的功能。主要有以下兩種技術(shù):
通過嵌入擴展類型
下例把一些集合函數(shù)變成方法,而且新增了一些基本運算符重載,實現(xiàn)了新的集合對象。對于多數(shù)類而言,這個類只是包裝了Python列表,以及附加的集合運算。
#File setwrapper.py class Set: def __init__(self,value=[]):#構(gòu)造函數(shù) self.data = [] self.concat(value) def intersect(self,other):#求交集 res = [] for x in self.data: if x in other: res.append(x) return Set(res) #返回一個新的Set def union(self,other):#求并集 res = self.data[:] #復(fù)制self.data for x in other: if not x in res: res.append(x) return Set(res) def concat(self,value): for x in value: if not x in self.data: self.data.append(x) def __len__(self): # len(self) return len(self.data) def __getitem__(self,key): # self[i] return self.data[key] def __and__(self,other): # self & other return self.intersect(other) def __or__(self,other): # self | other return self.union(other) def __repr__(self): # print return 'Set:' + repr(self.data) if __name__ == '__main__': #測試用例 x = Set([1,3,5,7]) print(x.union(Set([1,4,7]))) print(x | Set([1,4,6])) print(x[2]) print(x[2:4])
重載索引運算讓Set類的實例可以充當真正的列表。運行結(jié)果如下:
>>>
Set:[1, 3, 5, 7, 4]
Set:[1, 3, 5, 7, 4, 6]
5
[5, 7]
通過子類擴展類型
從Python2.2開始,所有內(nèi)置類型都可以直接創(chuàng)建子類。
這樣讓你可以通過用戶定義的class語句,定制或擴展內(nèi)置類型的行為:建立類型名稱的子類并對其進行定制。類型的子類實例,可以用在原始的內(nèi)置類型能夠出現(xiàn)的任何地方。
例如,假如你對Python列表偏移值以0開始計算而不是1開始一直很困擾,這時你就可以編寫自己的子類,定制列表的核心行為,如下:
# File typesubclass.py #Map 1..N to 0..N-1; call back to built-in version class MyList(list): def __getitem__(self,offset): print('(indexing %s at %s)'%(self,offset)) return list.__getitem__(self,offset-1) if __name__ == '__main__': print(list('abc')) x = MyList('abc') print(x) print(x[1]) print(x[3]) x.append('spam') print(x) x.reverse() print(x) 在這個文件中,MyList子類擴展了內(nèi)置list類型的__getitem__索引運算方法,把索引1到N映射到實際的0到N-1。運行結(jié)果如下:
>>>
['a', 'b', 'c']
['a', 'b', 'c']
(indexing ['a', 'b', 'c'] at 1)
a
(indexing ['a', 'b', 'c'] at 3)
新聞熱點
疑難解答
圖片精選