魔法方法


python魔法方法詳解

    據說,Python 的對象天生擁有一些神奇的方法,他們總被雙下划線鎖包圍,他們是面向對象的python的一切.

    他們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了這些方法的某一個,那么這個方法就會在特殊的情況下被python調用.
你可以定義自己想要的行為,而這一切都是自動發生的.

    python 的魔術方法非常強大,然而隨之而來的則是責任,了解正確的方法去使用非常重要.


各魔法方法介紹如下:

a.基本魔法方法:
    1.__new__(cls[,...])
        a.__new__ 是在一個對象實例化的時候所調用的第一個方法.
        b.它的第一個參數是這個類,其他的參數是用來直接傳遞給__init__方法.
        c.__new__ 決定是否使用該__init__方法,因為__new__可以調用其他類的構造方法或者直接返回別的實例化對象來作為本類的實例,
            如果__new__沒有返回實例對象,則__init__不會被調用.
        d.__new__ 主要是用於繼承一個不可變的類型,不如一個tuple或者string

    2.__init__(self[,...]) 構造器,當一個實例被創建的時候調用的初始化方法
    3.__del__(self) 析構器,當一個實例被銷毀的時候調用的方法
    4.__call__(self[,args...]) 允許一個類的實例像函數一樣被調用: x(a,b) 調用 x.__call__(a,b)
    5.__len__(self) 定義當被 len() 調用時的行為
    6.__repr__(self) 定義當被 repr() 調用時的行為
    7.__str__(self) 定義當被 str() 調用時的行為
    8.__bytes__(self) 定義當被 bytes() 調用時的行為
    9.__hash__(self) 定義當被 hash() 調用時的行為
    10.__bool__(self) 定義當被 bool() 調用時的行為,應該返回的是True或者False
    11.__format__(self,format_spec) 定義當被 format() 調用時的行為

b.有關屬性
    *12.__getattr__(self,name) 定義當用戶試圖獲取一個不存在的屬性時
    *13.__getattribute__(self,name) 定義當該類的屬性被訪問時的行為
    14.__setattr__(self,name,value) 定義當一個屬性被設置時的行為
    *15.__delattr__(self,name) 定義當一個屬性被刪除時的行為
    16.__dir__(self,name) 定義當 dir() 被調用時的行為
    17.__get__(self,instance,owner) 定義當描述符的值被取得時的行為
    18.__set__(self,instance,value) 定義當描述符的值被改變時的行為
    19.__delete__(self,instance) 定義當描述符的值被刪除時的行為

c.比較操作符
    20.__lt__(self,other) 定義小於號的行為: x<y 調用 x.__lt__(y)
    21.__le__(self,other) 定義小於等於號的行為: x<=y 調用 x.__le__(y)
    22.__eq__(self,other) 定義等於號的行為: x==y 調用 x.__eq__(y)
    23.__ne__(self,other) 定義不等號的行為: x!=y 調用 x.__ne__(y)
    24.__gt__(self,other) 定義大於號的行為: x>y 調用 x.__gt__(y)
    25.__ge__(self,other) 定義大於等於號的行為: x>=y 調用 x.__ge__(y)

d.算法運算符
    26.__add__(self,other) 定義加法的行為: +
    27.__sub__(self,other) 定義減法的算法: -
    28.__mul__(self,other) 定義乘法的行為: *
    29.__truediv__(self,other) 定義真除法的行為: /
    30.__floordiv__(self,other) 定義整數除法(地板除)的行為: //
    31.__mod__(self,other) 定義取模算法的行為: %
    32.__divmod__(self,other) 定義當被 divmod() 調用時的行為
    33.__pow__(self,other[,modulo]) 定義當被 power() 調用或**運算時的行為
    34.__lshift__(self,other) 定義按位左移的行為:<<
    35.__rshift__(self,other) 定義按位右移的行為:>>
    36.__add__(self,other) 定義按位與操作的行為:&
    37.__xor__(self,other) 定義按位異或操作的行為:^
    38.__or__(self,other) 定義按位或操作的行為:|

e.反運算
    39.__radd__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    40.__rsub__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    41.__rmul__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    42.__rtruediv__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    43.__rfloordiv__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    44.__rmod__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    45.__rdivmod__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    46.__rpow__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    47.__rlshift__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    48.__rrshift__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    49.__rxor__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用
    50.__ror__(self,other) 與上方相同,當左操作數不支持相應的操作時被調用

f.增量賦值運算
    51.__iadd__(self, other)    定義賦值加法的行為:+=
    52.__isub__(self, other)    定義賦值減法的行為:-=
    53.__imul__(self, other)    定義賦值乘法的行為:*=
    54.__itruediv__(self, other)    定義賦值真除法的行為:/=
    55.__ifloordiv__(self, other)    定義賦值整數除法的行為://=
    56.__imod__(self, other)    定義賦值取模算法的行為:%=
    57.__ipow__(self, other[, modulo])    定義賦值冪運算的行為:**=
    58.__ilshift__(self, other)    定義賦值按位左移位的行為:<<=
    59.__irshift__(self, other)    定義賦值按位右移位的行為:>>=
    60.__iand__(self, other)    定義賦值按位與操作的行為:&=
    61.__ixor__(self, other)    定義賦值按位異或操作的行為:^=
    62.__ior__(self, other)    定義賦值按位或操作的行為:|=

g。一元操作符
    63._neg__(self)    定義正號的行為:+x
    64.__pos__(self)    定義負號的行為:-x
    65.__abs__(self)    定義當被 abs() 調用時的行為
    66.__invert__(self)    定義按位求反的行為:~x

h.類型轉換
    67.__complex__(self)    定義當被 complex() 調用時的行為(需要返回恰當的值)
    68.__int__(self)    定義當被 int() 調用時的行為(需要返回恰當的值)
    69.__float__(self)    定義當被 float() 調用時的行為(需要返回恰當的值)
    70.__round__(self[, n])    定義當被 round() 調用時的行為(需要返回恰當的值)
    71.__index__(self)    1. 當對象是被應用在切片表達式中時,實現整形強制轉換
                        2. 如果你定義了一個可能在切片時用到的定制的數值型,你應該定義 __index__
                        3. 如果 __index__ 被定義,則 __int__ 也需要被定義,且返回相同的值

i.上下文管理(with 語句)
    72.__enter__(self)    1. 定義當使用 with 語句時的初始化行為
                        2. __enter__ 的返回值被 with 語句的目標或者 as 后的名字綁定
    73.__exit__(self, exc_type, exc_value, traceback)
                1. 定義當一個代碼塊被執行或者終止后上下文管理器應該做什么
                2. 一般被用來處理異常,清除工作或者做一些代碼塊執行完畢之后的日常工作

j.容器類型
    74.__len__(self)    定義當被 len() 調用時的行為(返回容器中元素的個數)
    75.__getitem__(self, key)    定義獲取容器中指定元素的行為,相當於 self[key]
    76.__setitem__(self, key, value)    定義設置容器中指定元素的行為,相當於 self[key] = value
    77.__delitem__(self, key)    定義刪除容器中指定元素的行為,相當於 del self[key]
    78.__iter__(self)    定義當迭代容器中的元素的行為
    79.__reversed__(self)    定義當被 reversed() 調用時的行為
    80.__contains__(self, item)    定義當使用成員測試運算符(innot in)時的行為

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM