python 包裝型別 與定製類

2021-06-28 17:36:20 字數 4264 閱讀 1291

在定製類的過程中,新增的方法和屬效能完成大部分工作。但若想要類表現出一些特殊行為或者能夠響應某些內建函式或操作符,那麼就需要構建一些特殊方法。這些特殊方法的標識是方法名以雙下劃線()開頭與結尾,除了常用的構造器 __init() 外,還有一些常用的特殊方法。

基礎方法:

c.__new__(self[,arg1,…])        構造器(帶一些可選的引數);通常用在設定不可變資料型別的子類

c.__del__(self) 解構器

c.__str__(self) 可列印的字串輸出;內建 str() 及 print() 函式

c.__repr__(self) 執行時的字串輸出;內建 repr() 函式及 ' ' 操作符

c.__call__(self,*args) 用於可呼叫的例項;可以用來替代閉包的實現

c.__nonezero__(self) 為例項定義 false 值;內建 bool() 函式

c.__len__(self) 長度;內建 len()

類的值比較:

c.__cmp__(self,obj)        物件比較;內建 cmp()

c.__lt__(self,obj) & c.__le__(self,obj) 小於或小於等於;內建< & <=

c.__gt__(self,obj) & c.__ge__(self,obj) 大於或大於等於;內建 > & >=

c.__eq__(self,obj) & c.__ne__(self,obj) 等於或不等於;內建 = & !=

類的屬性:

c.__getattr__(self,attr)        獲取屬性;內建 getattr();僅在屬性沒有找到時呼叫

c.__setattr__(self,attr) 設定屬性

c.__delattr__(self,attr) 刪除屬性

c.__getattribute__(self,attr) 獲取屬性;內建 getattr();總是被呼叫

c.__get__(self,attr) (描述符)獲取屬性

c.__set__(self,attr) (描述符)設定屬性

c.__delete__(self,attr) (描述符)刪除屬性

數值型別,二進位制操作符:

c.__*add__(self,obj)        加;+ 操作符

c.__*sub__(self,obj) 減;+ 操作符

c.__*mul__(self,obj) 乘;* 操作符

c.__*dev__(self,obj) 除;/ 操作符

c.__*truediv__(self,obj) 真正的除法;/ 操作符

c.__*floordiv__(self,obj) 地板除;// 操作符

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()

c.__int__(self) 內建 int()

c.__float__(self) 內建 float()

數值型別,數值壓縮:

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)        類中的專案數

c.__hash__(self) 雜湊(hash)函式值

c.__getitem__(self,key) 獲取某個值

c.__setitem__(self,key,val) 設定某個值

c.__delitem__(self,key) 刪除某個值

c.__missing__(self,key) 給定鍵若不存在,則返回乙個預設值

一般常用的特殊方法就是上面這些,某些如 coerce() 這樣在 python3 中被刪除或失效的內建函式就沒有再列出來。因為 python 的內建型別已經能夠滿足日常需求,所以下面的例子就只來實現乙個功能吧:雖然 float 型別有 .hex() 方法,但內建的 hex() 函式卻不支援 float 型別。所以我們來自定義乙個可以被內建的 hex() 呼叫的浮點型別。為了省事,我們就直接從 float 派生了~

class ifloat(float):

defindex(self):

return int(self)

執行結果如下:

a = ifloat(1.1)

hex(a)

『0x1』

p.s. 上面這個例子是個偽栗子。因為他實際是通過將浮點數強制轉換為整數來滿足呼叫 hex() 函式的條件的。按照官方文件的說法,hex() 函式只接受 int 型別做引數,你在 ifloat 裡實現hex() 也沒用,這也是我把oct() 和hex() 從上面刪除的原因。同時按照官方文件的說法,如果你硬要呼叫內建 hex() 函式,則必須實現index() 方法來返回乙個整數(是的,還是得要整數…)

即,下面這種方法是木有用的:

class ifloat(float):

defhex(self):

return self.hex()

仍然會報錯,儘管hex(self) 可以返回正常值:

a = ifloat(1.1)

hex(a)

traceback (most recent call last):

file 「

包裝類 包裝類物件 包裝類的型別轉換功能 已完結

在敘述前首先區分三者間的關係 因為在複習過程中,發現自己傻傻分不清 1.包裝類 js提供了三個包裝類 boolean string number 這兒不是基本資料型別中的boolean string number。上述是包裝類,是物件 2.包裝 類 物件 使用new boolean string n...

python定製 python中定製類

1 python中 str 和repr 如果要把乙個類的例項變成 str,就需要實現特殊方法 str classperson object def init self,name,gender self.name name self.gender genderdef str self return p...

JAVA基本型別與包裝類

1.宣告方式不同,基本型別不適用new關鍵字,而包裝型別需要使用new關鍵字來在堆中分配儲存空間 2.儲存方式及位置不同,基本型別 區域性變數在棧中,成員變數實在堆中,靜態變數在data區中 是直接將變數值儲存在棧中,而包裝型別是將物件放在堆中,然後通過引用來使用 3.初始值不同,基本型別的初始值如...