*(擴展)定制類

用特殊方法定制類 ***********************#特殊方法是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 :: '']

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容