構(gòu)造與初始化
__new__(cls, [...) 類的初始化過(guò)程中第一個(gè)被執(zhí)行的方法。
__init__(self, [...) 類的構(gòu)造器,必須返回對(duì)象
__del__(self) 析構(gòu)函數(shù)。它定義了一個(gè)被垃圾回收的行為。它在類消除的時(shí)后需要做一些額外的行為時(shí)是非常有用 __del__很少被使用,因?yàn)樗恼{(diào)用是非常不穩(wěn)定的;請(qǐng)謹(jǐn)慎使用!
__metaclass__ 定義當(dāng)前類的元類
__class__ 查看對(duì)象所屬的類
__base__ 獲取當(dāng)前類的父類
__bases__ 獲取當(dāng)前類的所有父類
類中的操作
比較方法
__cmp__(self, other) 實(shí)現(xiàn)了所有的比較運(yùn)算符(如<, ==, !=)的行為,當(dāng)self < other時(shí)__cmp__應(yīng)該返回一個(gè)負(fù)整數(shù),當(dāng)self == other時(shí)返回0,self > other時(shí)返回正整數(shù)。python3被刪除
__eq__(self, other) 定義相等符號(hào)的行為,==
__ne__(self,other) 定義不等符號(hào)的行為,!=
__lt__(self,other) 定義小于符號(hào)的行為,<
__gt__(self,other) 定義大于符號(hào)的行為,>
__le__(self,other) 定義小于等于符號(hào)的行為,<=
__ge__(self,other) 定義大于等于符號(hào)的行為,>=
數(shù)值魔術(shù)方法
_pos__(self) 實(shí)現(xiàn)一個(gè)取正數(shù)的操作(比如 +some_object ,python調(diào)用__pos__函數(shù))
__neg__(self) 實(shí)現(xiàn)一個(gè)取負(fù)數(shù)的操作(比如 -some_object )
__abs__(self) 實(shí)現(xiàn)一個(gè)內(nèi)建的abs()函數(shù)的行為
__invert__(self) 實(shí)現(xiàn)一個(gè)取反操作符(~操作符)的行為。想要了解這個(gè)操作的解釋,參考the Wikipedia article on bitwise operations.
__round__(self, n) 實(shí)現(xiàn)一個(gè)內(nèi)建的round()函數(shù)的行為。 n 是待取整的十進(jìn)制數(shù).
__floor__(self) 實(shí)現(xiàn)math.floor()的函數(shù)行為,比如, 把數(shù)字下取整到最近的整數(shù).
__ceil__(self) 實(shí)現(xiàn)math.ceil()的函數(shù)行為,比如, 把數(shù)字上取整到最近的整數(shù).
__trunc__(self) 實(shí)現(xiàn)math.trunc()的函數(shù)行為,比如, 把數(shù)字截?cái)喽玫秸麛?shù).
算數(shù)運(yùn)算
__add__(self, other) 實(shí)現(xiàn)一個(gè)加法.
__sub__(self, other) 實(shí)現(xiàn)一個(gè)減法.
__mul__(self, other) 實(shí)現(xiàn)一個(gè)乘法.
__floordiv__(self, other) 實(shí)現(xiàn)一個(gè)“//”操作符產(chǎn)生的整除操作()
__div__(self, other) 實(shí)現(xiàn)一個(gè)“/”操作符代表的除法操作.
__truediv__(self, other) 實(shí)現(xiàn)真實(shí)除法,注意,只有當(dāng)from __future__ import division時(shí)才會(huì)有效
__mod__(self, other) 實(shí)現(xiàn)一個(gè)“%”操作符代表的取模操作.
__divmod__(self, other) 實(shí)現(xiàn)一個(gè)內(nèi)建函數(shù)divmod()
__pow__ 實(shí)現(xiàn)一個(gè)指數(shù)操作(“**”操作符)的行為
__lshift__(self, other) 實(shí)現(xiàn)一個(gè)位左移操作(<<)的功能
__rshift__(self, other) 實(shí)現(xiàn)一個(gè)位右移操作(>>)的功能.
__and__(self, other) 實(shí)現(xiàn)一個(gè)按位進(jìn)行與操作(&)的行為.
__or__(self, other) 實(shí)現(xiàn)一個(gè)按位進(jìn)行或操作(|)的行為.
__xor__(self, other) 實(shí)現(xiàn)一個(gè)異或操作(^)的行為
反射算術(shù)運(yùn)算符
所有的魔法方法做的事情與正常運(yùn)算表示的意義是等價(jià)的。注意,下面參數(shù)othe必須保證該對(duì)像沒(méi)有定義(或者返回NotImplemented的)它的非反射運(yùn)算符。例如,在這個(gè)例子中,some_object.__radd__ 只有在 other沒(méi)有定義__add__的時(shí)候才會(huì)被調(diào)用。
__radd__(self, other) 反射加法
__rsub__(self, other) 反射減法的
__rmul__(self, other) 反射除法
__rfloordiv__(self, other) 反射地板除,使用//運(yùn)算符的
__rdiv__(self, other) 反射除法,使用/運(yùn)算符的.
__rtruediv__(self, other) 反射真除.注意只有from __future__ import division 的時(shí)候它才有效
__rmod__(self, other) 反射取模運(yùn)算,使用%運(yùn)算符.
__rdivmod__(self, other) 長(zhǎng)除法,使用divmod()內(nèi)置函數(shù),當(dāng)divmod(other,self)時(shí)被調(diào)用.
__rpow__ 反射乘方,使用**運(yùn)算符的
__rlshift__(self, other) 反射左移,使用<<操作符.
__rrshift__(self, other) 反射右移,使用>>操作符.
__rand__(self, other) 反射位與,使用&操作符.
__ror__(self, other) 反射位或,使用|操作符.
__rxor__(self, other) 反射異或,使用^操作符.
增量運(yùn)算
__iadd__(self, other) 加法賦值
__isub__(self, other) 減法賦值.
__imul__(self, other) 乘法賦值
__ifloordiv__(self, other) 整除賦值,地板除,相當(dāng)于 //= 運(yùn)算符.
__idiv__(self, other) 除法賦值,相當(dāng)于 /= 運(yùn)算符. python3中不存在
__itruediv__(self, other) 真除賦值,注意只有 whenfrom __future__ import divisionis,才有效.
__imod_(self, other) 模賦值,相當(dāng)于 %= 運(yùn)算符.
__ipow__ 乘方賦值,相當(dāng)于 **= 運(yùn)算符.
__ilshift__(self, other) 左移賦值,相當(dāng)于 <<= 運(yùn)算符.
__irshift__(self, other) 左移賦值,相當(dāng)于 >>= 運(yùn)算符.
__iand__(self, other) 與賦值,相當(dāng)于 &= 運(yùn)算符.
__ior__(self, other) 或賦值,相當(dāng)于 |= 運(yùn)算符.
__ixor__(self, other) 異或運(yùn)算符,相當(dāng)于 ^= 運(yùn)算符.
類型轉(zhuǎn)換魔法
__int__(self) 轉(zhuǎn)換成整型.
__long__(self) 轉(zhuǎn)換成長(zhǎng)整型.
__float__(self) 轉(zhuǎn)換成浮點(diǎn)型.
__complex__(self) 轉(zhuǎn)換成 復(fù)數(shù)型.
__oct__(self) 轉(zhuǎn)換成八進(jìn)制.
__hex__(self) 轉(zhuǎn)換成十六進(jìn)制.
__index__(self) 當(dāng)對(duì)象被切片時(shí)轉(zhuǎn)換成int型。如果定義了一個(gè)可能被用來(lái)做切片操作的數(shù)值型,就應(yīng)該定義__index__.
__trunc__(self) 當(dāng) math.trunc(self) 使用時(shí)被調(diào)用.__trunc__返回自身類型的整型截取 (通常是一個(gè)長(zhǎng)整型).
__coerce__(self, other) 執(zhí)行混合類型的運(yùn)算,如果轉(zhuǎn)換不能完成,應(yīng)該返回None;否則,要返回一對(duì)兩個(gè)元數(shù)的元組self和other, 被操作成同類型。python3被廢棄
表示類
__str__(self) 定義當(dāng) str() 被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。
__repr__(self) 定義 當(dāng) repr() 被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。 str() 和 repr() 的主要區(qū)別是其目標(biāo)群體。 repr() 返回的是機(jī)器可讀的輸出,而 str() 返回的是人類可讀的。
__unicode__(self) unicode() 和 str() 很相似,但是返回的是unicode字符串。python3這個(gè)方法已經(jīng)不存在了,并且__bytes__(它的行為與__str__和__unicode__類似)成為新的自帶方法來(lái)構(gòu)造byte數(shù)組
__format__(self, formatstr) 定義當(dāng)一個(gè)類的實(shí)例被用來(lái)用新式的格式化字符串方法進(jìn)行格式化時(shí)所要產(chǎn)生的行為。
__hash__(self) 定義當(dāng) hash()被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。它返回一個(gè)整數(shù),用來(lái)在字典中進(jìn)行快速比較。請(qǐng)注意,這通常也承擔(dān)著實(shí)現(xiàn)__eq__。有下面這樣的規(guī)則:a == b 暗示著 hash(a) == hash(b) 。
__nonzero__(self) 定義當(dāng) bool() 被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。本方法應(yīng)該返回True或者False。python3被命名為bool
__dir__(self) 定義當(dāng) dir() 被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。該方法應(yīng)該返回一個(gè)屬性的列表給用戶,如果重新定義了__getattr__或__getattribute__或者其它的動(dòng)態(tài)生成屬性,那么它對(duì)類的交互使用是至關(guān)重要的。
__sizeof__(self) 定義當(dāng) sys.getsizeof() 被一個(gè)類的實(shí)例調(diào)用時(shí)所要產(chǎn)生的行為。該方法應(yīng)該以字節(jié)為單位,返回對(duì)象的大小。
屬性訪問(wèn)控制
__getattr__(self, name) 定義如何處理用戶試圖訪問(wèn)一個(gè)不存在(不存在或還沒(méi)創(chuàng)建)屬性的行為。這對(duì)于捕獲或者重定向一般的拼寫(xiě)錯(cuò)誤非常有用,給出訪問(wèn)了不能訪問(wèn)的屬性的警告(如果愿意,還可以推斷并返回那個(gè)屬性。),或者巧妙地處理一個(gè)AttributeError異常。
__setattr__(self, name, value) 與__getattr__不同,__setattr__是一個(gè)真正的封裝方案。它允許定義當(dāng)給一個(gè)存在或不存在的屬性賦值時(shí)的行為,意味著對(duì)任何屬性值的改變都可以定義一個(gè)規(guī)則。
__delattr__ 它與__setattr__非常像, 只不過(guò)是用來(lái)刪除而不是設(shè)置屬性。 __detattr__需要預(yù)防措施,就像setattr一樣,當(dāng)被調(diào)用時(shí)可能會(huì)引起無(wú)限遞歸(當(dāng)__delattr__已經(jīng)實(shí)現(xiàn)時(shí),調(diào)用 del self.name 就會(huì)引起無(wú)限的遞歸)。
__getattribute__(self, name) 只有在新風(fēng)格的類中才會(huì)被使用(所有的新風(fēng)格類在Python最新的版本中,在老版本中,可以子類化object來(lái)獲得一個(gè)新風(fēng)格類。它允許定義一條規(guī)則來(lái)處理無(wú)論什么時(shí)候?qū)傩灾当辉L問(wèn)時(shí)的行為。比如類似于由于其它的伙伴犯錯(cuò)而引起的無(wú)限遞歸(這時(shí)就可以調(diào)用基類的__getattribute__方法來(lái)阻止它)。它也避免了對(duì)__getattr__的依賴,當(dāng)__getattribute__方法已經(jīng)實(shí)現(xiàn)的時(shí)候,__getattr__只有在__getattribute__被明確的調(diào)用或拋出一個(gè)AttributeError異常的時(shí)候才會(huì)被調(diào)用。,不常用。
容器相關(guān)
__len__(self) 返回容器的長(zhǎng)度。對(duì)于可變和不可變?nèi)萜鞯膮f(xié)議,這都是其中的一部分。
__getitem__(self, key) 定義當(dāng)某一項(xiàng)被訪問(wèn)時(shí),使用self[key]所產(chǎn)生的行為。這也是不可變?nèi)萜骱涂勺內(nèi)萜鲄f(xié)議的一部分。如果鍵的類型錯(cuò)誤將產(chǎn)生TypeError;如果key沒(méi)有合適的值則產(chǎn)生KeyError。
__setitem__(self, key, value) 定義當(dāng)一個(gè)條目被賦值時(shí),使用self[nkey] = value所產(chǎn)生的行為。這也是協(xié)議的一部分。而且,在相應(yīng)的情形下也會(huì)產(chǎn)生KeyError和TypeError。
__delitem__(self, key) 定義當(dāng)某一項(xiàng)被刪除時(shí)所產(chǎn)生的行為。(例如del self[key])。這只是可變?nèi)萜鲄f(xié)議的一部分。當(dāng)使用一個(gè)無(wú)效的鍵時(shí)必須拋出適當(dāng)?shù)漠惓!?br />__iter__(self) 返回一個(gè)容器迭代器,很多情況下會(huì)返回迭代器,尤其是當(dāng)內(nèi)置的iter()方法被調(diào)用的時(shí)候,以及當(dāng)使用for x in container:方式循環(huán)的時(shí)候。迭代器是它們本身的對(duì)象,它們必須定義返回self的__iter__方法。
__reversed__(self) 實(shí)現(xiàn)當(dāng)reversed()被調(diào)用時(shí)的行為。應(yīng)該返回序列反轉(zhuǎn)后的版本。僅當(dāng)序列可以是有序的時(shí)候?qū)崿F(xiàn)它,例如對(duì)于列表或者元組。
__contains__(self, item) 定義了調(diào)用in和not in來(lái)測(cè)試成員是否存在的時(shí)候所產(chǎn)生的行為。可能會(huì)問(wèn)為什么這個(gè)不是序列協(xié)議的一部分?因?yàn)楫?dāng)__contains__沒(méi)有被定義的時(shí)候,Python會(huì)迭代這個(gè)序列,并且當(dāng)找到需要的值時(shí)會(huì)返回True。
__missing__(self, key) 其在dict的子類中被使用。它定義了當(dāng)一個(gè)不存在字典中的鍵被訪問(wèn)時(shí)所產(chǎn)生的行為。(例如,如果我有一個(gè)字典d,當(dāng)"george"不是字典中的key時(shí),使用了d["george"],此時(shí)d["george"]將會(huì)被調(diào)用)。
反射
__instancecheck__(self, instance) 檢查對(duì)象是否是您定義的類的一個(gè)實(shí)例(例.isinstance(instance, class).
__subclasscheck__(self, subclass) 檢查類是否是定義類的子類 (例.issubclass(subclass, class)).
可調(diào)用對(duì)象
__call__(self, [args...]) 允許一個(gè)類的實(shí)例像函數(shù)一樣被調(diào)用 在那些類的實(shí)例經(jīng)常改變狀態(tài)的時(shí)候會(huì)非常有效。“調(diào)用”這個(gè)實(shí)例是一種改變這個(gè)對(duì)象狀態(tài)的直接和優(yōu)雅的做法。
會(huì)話管理器 包裝一個(gè)with語(yǔ)句來(lái)設(shè)置和清理相應(yīng)對(duì)象的行為
__enter__(self) 定義了當(dāng)使用with語(yǔ)句的時(shí)候,會(huì)話管理器在塊被初始創(chuàng)建事要產(chǎn)生的行為。請(qǐng)注意,__enter__的返回值與with語(yǔ)句的目標(biāo)或者as后的名字綁定。
__exit__(self, exception_type, exception_value, traceback)定義了當(dāng)一個(gè)代碼塊被執(zhí)行或者終止后,會(huì)話管理器應(yīng)該做什么。它可以被用來(lái)處理異常、執(zhí)行清理工作或做一些代碼塊執(zhí)行完畢之后的日常工作。如果代碼塊執(zhí)行成功,exception_type,exception_value,和traceback將會(huì)為None。否則,可以選擇處理這個(gè)異常或者是直接交給用戶處理。如果想處理這個(gè)異常的話,請(qǐng)確保__exit__在所有語(yǔ)句結(jié)束之后返回True。如果想讓異常被會(huì)話管理器處理的話,那么就讓其產(chǎn)生該異常
創(chuàng)建描述器對(duì)象
__get__(self, instance, owner) 定義了當(dāng)描述器的值被取得的時(shí)候的行為。instance是擁有該描述器對(duì)象的一個(gè)實(shí)例。owner是擁有者本身。
__set__(self, instance, value) 定義了當(dāng)描述器的值被改變的時(shí)候的行為。instance是擁有該描述器類的一個(gè)實(shí)例。value是要設(shè)置的值。
__delete__(self, instance) 定義了當(dāng)描述器的值被刪除的時(shí)候的行為。instance是擁有該描述器對(duì)象的一個(gè)實(shí)例。
復(fù)制
__copy__(self) copy.copy()返回了對(duì)象的一個(gè)淺拷貝——這意味著,當(dāng)實(shí)例本身是一個(gè)新實(shí)例時(shí),它的所有數(shù)據(jù)都被引用, 因此,對(duì)于淺拷貝中數(shù)據(jù)的更改仍然可能導(dǎo)致數(shù)據(jù)在原始對(duì)象的中的改變。
__deepcopy__(self, memodict={}) 定義了當(dāng)對(duì)類的實(shí)例調(diào)用copy.deepcopy()時(shí)所產(chǎn)生的行為。copy.deepcopy()返回一個(gè)深拷貝——對(duì)象和其數(shù)據(jù)都被拷貝了。memodict是對(duì)之前被拷貝的對(duì)象的一個(gè)緩存——這優(yōu)化了拷貝過(guò)程并且阻止了對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)拷貝時(shí)的無(wú)限遞歸。要進(jìn)行對(duì)一個(gè)單獨(dú)的屬性進(jìn)行深拷貝時(shí),調(diào)用copy.deepcopy(),并以memodict為第一個(gè)參數(shù)。
Pickling 序列化 對(duì)象
__getinitargs__(self) 如果想在類被unpickle的時(shí)候執(zhí)行__init__方法,可重載__getinitargs__方法,它會(huì)返回一個(gè)元組,包含想傳給__init__方法的參數(shù)。注意,這種方法只適用于低版本的Python。
__getnewargs__(self) 對(duì)于新式類,在unpickle的時(shí)候可以決定傳給__new__方法的參數(shù)。以上方法可以返回一個(gè)包含想傳給__new__方法的參數(shù)元組。
__getstate__(self) 除了儲(chǔ)存__dict__中的原來(lái)的那些變量,可以自定義使用pickle序列化對(duì)象時(shí)想要儲(chǔ)存的額外屬性。這些屬性將在unpickle文件時(shí)被__setstate__方法使用。
__setstate__(self, state) 當(dāng)文件被unpickle時(shí),其中保存的對(duì)象屬性不會(huì)直接被寫(xiě)入對(duì)象的__dict中,而是會(huì)被傳入這個(gè)方法。這個(gè)方法和__getstate__是配套的:當(dāng)他們都被定義了的時(shí)候,可以任意定義對(duì)象被序列化存儲(chǔ)時(shí)的狀態(tài)。
__reduce__(self) 當(dāng)定義擴(kuò)展類(使用C語(yǔ)言實(shí)現(xiàn)的Python擴(kuò)展類)時(shí),可以通過(guò)實(shí)現(xiàn)__reduce__函數(shù)來(lái)控制pickle的數(shù)據(jù)。如果__reduce__()方法被定義了,在一個(gè)對(duì)象被pickle時(shí)它將被調(diào)用。如果它返回一個(gè)字符串,那么pickle在將在全局空間中搜索對(duì)應(yīng)名字的對(duì)象進(jìn)行pickle;它還可以返回一個(gè)元組,包含2-5個(gè)元素: 一個(gè)可以用來(lái)重建該對(duì)象的可調(diào)用對(duì)象,一個(gè)包含有傳給該可調(diào)用對(duì)象參數(shù)的元組,傳給__setstate__方法的參數(shù)(可選),一個(gè)用于待pickle對(duì)象列表的迭代器(譯者注:這些對(duì)象會(huì)被append到原來(lái)對(duì)象的后面)(可選)調(diào)用對(duì)象,一個(gè)包含有傳給該可調(diào)用對(duì)象參數(shù)的元組,傳給__setstate__方法的參數(shù)(可選),一個(gè)用于待pickle對(duì)象列表的迭代器(譯者注:這些對(duì)象會(huì)被append到原來(lái)對(duì)象的后面)(可選),一個(gè)用于待pickle的字典的迭代器(可選)。
__reduce_ex__(self) 是為兼容性而設(shè)計(jì)的。如果它被實(shí)現(xiàn)了,__reduce_ex__將會(huì)取代__reduce__在pickle時(shí)被執(zhí)行。__reduce__可以同時(shí)被實(shí)現(xiàn)以支持那些不支持__reduce_ex__的老版本pickling API。