這篇文章僅僅是總結(jié)性質(zhì)的,待以后有時(shí)間的時(shí)候會(huì)針對比較難理解的部分補(bǔ)充一些例子。
__init____del__
__call__
__str____rePR__
str(x), print(X):會(huì)先嘗試__str__方法,然后嘗試__repr__方法;repr(X)或交互模式下輸入X,只會(huì)嘗試__repr__方法。
__getattr__:只有類中沒有定義的屬性點(diǎn)號運(yùn)算才會(huì)嘗試該方法__setattr__:類中所有屬性的賦值語句都會(huì)嘗試該方法,self.attr=val會(huì)變成self.setattr('attr',val)__delattr____getattribute__:類中所有屬性的點(diǎn)號運(yùn)算都會(huì)嘗試該方法
__getitem____setitem____delitem__
__iter____next__
在所有的迭代環(huán)境中,會(huì)先嘗試__iter__方法,然后在嘗試__getitem__方法,但是注意迭代器根本沒有重載索引表達(dá)式,所以如果需要通過while來根據(jù)下標(biāo)手工迭代,那么需要定義__getitem__方法。
__contains__
in成員測試會(huì)先嘗試__contains__方法,然后是__iter__方法,最后是__getitem__方法。
__get____set__
delete
主要這里是__delete__,也析構(gòu)函數(shù)__del__是完全不同的。
__lt____le____gt____ge____eq__: !=和==都會(huì)嘗試該方法,所以需要確保兩個(gè)運(yùn)算符都正確地作用。
請看下面的實(shí)例:
class X: def __init__(self, value): self.data = value def __eq__(self, value): return self.data == valuex = X(4)print(x ==5)print(x != 5)結(jié)果為
FalseTrue__add__, __iadd__, __radd____sub__, __isub__, __rsub____mul__, __imul__:乘法__neg__, __pos__:表示-obj, +obj__abs____floordiv__, __ifloordiv__, __truediv__, __itruediv____mod__, __imod__, __imod____pow__, __ipow__
a += b會(huì)嘗試增強(qiáng)加法__iadd__,然后嘗試普通加法__add__
x = b + obj:如果b不是類實(shí)例時(shí),會(huì)調(diào)用右側(cè)加法__radd__
當(dāng)我們把兩個(gè)實(shí)例相加的時(shí)候,Python運(yùn)行__add__,它反過來通過簡化左邊的運(yùn)算數(shù)來觸發(fā)__radd__。
__concat__:比如序列a,b的加法a+b__iconcat__
__and__, __iand____or__, __ior__, __xor__, __ixor____inv__, __invert__ : ~obj__lshift__, __ilshift__, __rshift__, __irshift__
a &=b:會(huì)先嘗試__iand__,然后嘗試__add__
__bool____len__
布爾測試會(huì)先嘗試一個(gè)特定的__bool__方法,然后在嘗試__len__方法。在Python2.6中使用的名稱不是__bool__,而是__nonzero__
主要是用于with語句的上下文管理。__enter____exit__
__new__
這個(gè)函數(shù)會(huì)在類初始化函數(shù)__init__()之前調(diào)用
__index__
如果在bin(X), hex(X), oct(X), O[X], O[X:]等需要傳入一個(gè)數(shù)字、索引、分片的值時(shí)傳入一個(gè)對象,那么該對象的__index__會(huì)被調(diào)用。
主要是用來替代Python2.x中的__oct__, __hex__
新聞熱點(diǎn)
疑難解答
圖片精選