用特殊方法定制類 ***********************#特殊方法是Python 中用來擴充類的強有力的方式。它們可以實現:# 模擬標準類型# 重載操作符#特殊方法允許類通過重載標準操作符+,*, 甚至包括分段下標及映射操作操作[] 來模擬標準#類型。如同其它很多保留標識符,這些方法都是以雙下劃線(__)開始及結尾的。#下表列出了所有特殊方法及其它的描述#特殊方法 描述###基本定制型#C.__init__(self[, arg1, ...]) 構造器(帶一些可選的參數)#C.__new__(self[, arg1, ...]) 構造器(帶一些可選的參數);通常用在設置不變數據類型的子類。#C.__del__(self) 解構器#C.__str__(self) 可打印的字符輸出;內建str()及print 語句#C.__repr__(self) 運行時的字符串輸出;內建repr() 和‘‘ 操作符#C.__unicode__(self) Unicode 字符串輸出;內建unicode()#C.__call__(self, *args) 表示可調用的實例#C.__nonzero__(self) 為object 定義False 值;內建bool() (從2.2 版開始)#C.__len__(self) “長度”(可用于類);內建len()####對象(值)比較c#C.__cmp__(self, obj) 對象比較;內建cmp()#C.__lt__(self, obj) and 小于/小于或等于;對應<及<=操作符#C.__gt__(self, obj) and 大于/大于或等于;對應>及>=操作符#C.__eq__(self, obj) and 等于/不等于;對應==,!=及<>操作符######屬性#C.__getattr__(self, attr) 獲取屬性;內建getattr();僅當屬性沒有找到時調用#C.__setattr__(self, attr, val) 設置屬性#C.__delattr__(self, attr) 刪除屬性#C.__geta
ttribute__(self, attr) 獲取屬性;內建getattr();總是被調用#C.__get__(self, attr) (描述符)獲取屬性#C.__set__(self, attr, val) (描述符)設置屬性#C.__delete__(self, attr) (描述符)刪除屬性####數值類型:二進制操作符#C.__*add__(self, obj) 加;+操作符#C.__*sub__(self, obj) 減;-操作符#C.__*mul__(self, obj) 乘;*操作符#C.__*div__(self, obj) 除;/操作符#C.__*truediv__(self, obj) True 除;/操作符#C.__*floordiv__(self, obj) Floor 除;//操作符#C.__*mod__(self, obj) 取模/取余;%操作符#C.__*divmod__(self, obj) 除和取模;內建divmod()#C.__*pow__(self, obj[, mod]) 乘冪;內建pow();**操作符#C.__*lshift__(self, obj) 左移位;<<操作符#C.__*rshift__(self, obj) 右移;>>操作符#C.__*and__(self, obj) 按位與;&操作符#C.__*or__(self, obj) 按位或;|操作符#C.__*xor__(self, obj) 按位與或;^操作符####數值類型:一元操作符#C.__neg__(self) 一元負#C.__pos__(self) 一元正#C.__abs__(self) 絕對值;內建abs()#C.__invert__(self) 按位求反;~操作符######數值類型:數值轉換#C.__complex__(self, com) 轉為complex(復數);內建complex()#C.__int__(self) 轉為int;內建int()#C.__long__(self) 轉為long;內建long()#C.__float__(self) 轉為float;內建float()######數值類型:基本表示法(String)#C.__oct__(self) 八進制表示;內建oct()#C.__hex__(self) 十六進制表示;內建hex()######數值類型:數值壓縮#C.__coerce__(self, num) 壓縮成同樣的數值類型;內建coerce()#C.__index__(self) 在有必要時,壓縮可選的數值類型為整型(比如:用于切片索引等等)####序列類型#C.__len__(self) 序列中項的數目#C.__getitem__(self, ind) 得到單個序列元素#C.__setitem__(self, ind,val) 設置單個序列元素#C.__delitem__(self, ind) 刪除單個序列元素#C.__getslice__(self, ind1,ind2) 得到序列片斷#C.__setslice__(self, i1, i2,val)設置序列片斷#C.__delslice__(self, ind1,ind2) 刪除序列片斷#C.__contains__(self, val) 測試序列成員;內建in 關鍵字#C.__*add__(self,obj) 串連;+操作符#C.__*mul__(self,obj) 重復;*操作符#C.__iter__(self) 創建迭代類;內建iter()######映射類型#C.__len__(self) mapping 中的項的數目#C.__hash__(self) 散列(hash)函數值#C.__getitem__(self,key) 得到給定鍵(key)的值#C.__setitem__(self,key,val) 設置給定鍵(key)的值#C.__delitem__(self,key) 刪除給定鍵(key)的值#C.__missing__(self,key) 給定鍵如果不存在字典中,
則提供一個默認值## 12.1 簡單定制(RoundFloat2)#類的作用:保存浮點數,四舍五入,保留兩位小數位。 通過斷言來控制輸入類型#class RoundFloatManual(object):# def __init__(self, val):# assert isinstance(val, float), \# "Value must be a float!"# self.value = round(val, 2)## def __str__(self):# return str(self.value)## __repr__ = __str__##C.__str__(self) 可打印的字符輸出;內建str()及print 語句#C.__repr__(self) 運行時的字符串輸出;內建repr() 和‘‘ 操作符#rfm=RoundFloatManual(8.888)#print(rfm)#-->8.89## 12.2 數值定制(Time60)#class Time60(object):# 'Time60 - track hours and minutes'## def __init__(self, hr, min):# 'Time60 constructor - takes hours and minutes'# self.hr = hr# self.min = min## def __str__(self):# 'Time60 - string representation'# return '%d:%d' % (self.hr, self.min)## __repr__ = __str__## def __add__(self, other):# 'Time60 - overloading the addition operator'# return self.__class__(self.hr + other.hr,self.min + other.min)# # def __iadd__(self, other):# 'Time60 - overloading in-place addition'# self.hr += other.hr# self.min += other.min# return self## 12.3 迭代器(RandSeq 和AnyIter)## RandSeq#from random import choice##class RandSeq(object):# def __init__(self, seq):# self.data = seq## def __iter__(self):# return self## def next(self):# return choice(self.data)## 任意項的迭代器(anyIter.py)#class AnyIter(object):# def __init__(self, data, safe=False):# self.safe = safe# self.iter = iter(data)## def __iter__(self):# return self## def next(self, howmany=1):# retval = []# for eachItem in range(howmany):# try:# retval.append(self.iter.next())# except StopIteration:# if self.safe:# break# else:# raise# return retval## 12.4 *多類型定制(NumStr)#class NumStr(object):# def __init__(self, num=0, string=''):# self.__num= num# self.__string = string## def __str__(self): # define for str()# return '[%d :: %r]' %(self.__num, self.__string)# # __repr__ = __str__## def __add__(self, other): # define for s+o# if isinstance(other, NumStr):# return self.__class__(self.__num + \# other.__num, \# self.__string + other.__string)# else:# raise TypeError('Illegal argument type for built-in operation')## def __mul__(self, num): # define for o*n# if isinstance(num, int):# return self.__class__(self.__num__ * num,self.__string__ * num)# else:# raise TypeError('Illegal argument type for built-in operation')## def __nonzero__(self):
# False if both are# return self.__num or len(self.__string)##a = NumStr(3, 'foo')#b = NumStr(3, 'goo')#c = NumStr(2, 'foo')#d = NumStr()#e = NumStr(string='boo')#f = NumStr(1)#print(a)#print(b)#print(c)#print(d)#print(e)#print(f)#-->#[3 :: 'foo']#[3 :: 'goo']#[2 :: 'foo']#[0 :: '']#[0 :: 'boo']#[1 :: '']