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