用python特殊方法實現的重載操作

用python特殊方法實現的重載操作


python的內置內爲許多操作提供了自然的語義。比如,a+b語句可以調用數值類型語句,也可以是連接序列類型。
默認情況下,對於新定義的類來說,‘+’操作符是未定義的。然而,我們可以通過操作符重載技術來定義。這個定義可通過一個特殊的命名方法來實現。特別的是,名爲__add__\_\_\mathrm{add}\_\_(這裏兩條下劃線)的方法重載+操作符, __add__\_\_\mathrm{add}\_\_用右邊的操作作爲參數並返回表示表達式的結果。也就是說,a+b語句,被轉化爲一個調用a.__add__\_\_\mathrm{add}\_\_(b)對象的方法。

這裏提供一個與這個類似的全部特殊方法重載操作的表格

常見的語法 特別方法的形式
a+b a.__add__(b)a.\_\_\mathrm{add}\_\_(b); 或者 b.__radd__(a)b.\_\_\mathrm{radd}\_\_(a)
a-b a.__sub__(b)a.\_\_\mathrm{sub}\_\_(b); 或者b.__rsub__(a)b.\_\_\mathrm{rsub}\_\_(a)
a*b a.__mul__(b)a.\_\_\mathrm{mul}\_\_(b); 或者b.__rmul__(a)b.\_\_\mathrm{rmul}\_\_(a)
a/b a.__truediv__(b)a.\_\_\mathrm{truediv}\_\_(b); 或者b.__rtruediv__(a)b.\_\_\mathrm{rtruediv}\_\_(a)
a//b a.__floordiv__(b)a.\_\_\mathrm{floordiv}\_\_(b); 或者b.__rfloordiv__(a)b.\_\_\mathrm{rfloordiv}\_\_(a)
a%b a.__mod__(b)a.\_\_\mathrm{mod}\_\_(b); 或者b.__mod__(a)b.\_\_\mathrm{mod}\_\_(a)
a**b a.__pow__(b)a.\_\_\mathrm{pow}\_\_(b); 或者b.__rpow__(a)b.\_\_\mathrm{rpow}\_\_(a)
a<<b a.__lshift__(b)a.\_\_\mathrm{lshift}\_\_(b); 或者b.__rshift__(a)b.\_\_\mathrm{rshift}\_\_(a)
a>>b a.__rshift__(b)a.\_\_\mathrm{rshift}\_\_(b); 或者b.__rrshift__(a)b.\_\_\mathrm{rrshift}\_\_(a)
a&b a.__and__(b)a.\_\_\mathrm{and}\_\_(b); 或者b.__rand__(a)b.\_\_\mathrm{rand}\_\_(a)
a^b a.__xor__(b)a.\_\_\mathrm{xor}\_\_(b); 或者b.__rxor__(a)b.\_\_\mathrm{rxor}\_\_(a)
a|b a.__or__(b)a.\_\_\mathrm{or}\_\_(b); 或者b.__ror__(a)b.\_\_\mathrm{ror}\_\_(a)
a+=b a.__iadd__(b)a.\_\_\mathrm{iadd}\_\_(b);
a-=b a.__isub__(b)a.\_\_\mathrm{isub}\_\_(b);
a*=b a.__imul__(b)a.\_\_\mathrm{imul}\_\_(b);
+a a.__pos__(b)a.\_\_\mathrm{pos}\_\_(b);
-a a.__neg__(b)a.\_\_\mathrm{neg}\_\_(b);
~a a.__invert__(b)a.\_\_\mathrm{invert}\_\_(b);
abs(a) a.__abs__(b)a.\_\_\mathrm{abs}\_\_(b);
a<b a.__lt__(b)a.\_\_\mathrm{lt}\_\_(b);
a<=b a.__le__(b)a.\_\_\mathrm{le}\_\_(b);
a>b a.__gt__(b)a.\_\_\mathrm{gt}\_\_(b);
a>=b a.__ge__(b)a.\_\_\mathrm{ge}\_\_(b);
a==b a.__eq__(b)a.\_\_\mathrm{eq}\_\_(b);
a!=b a.__ne__(b)a.\_\_\mathrm{ne}\_\_(b);
v in a a.__contains__(v)a.\_\_\mathrm{contains}\_\_(v);
a[k] a.__getitem__(b)a.\_\_\mathrm{getitem}\_\_(b);
a[k]=v a.__setitem__(b)a.\_\_\mathrm{setitem}\_\_(b);
del a[k] a.__truediv__(k)a.\_\_\mathrm{truediv}\_\_(k);
a(arg 1,arg 2,\cdots,… a.__call__(arg1,arg2,)a.\_\_\mathrm{call}\_\_(arg1,arg2,\cdots);
len(a) a.__len__()a.\_\_\mathrm{len}\_\_();
hash(a) a.__hash__()a.\_\_\mathrm{hash}\_\_();
iter(a) a.__iter__()a.\_\_\mathrm{iter}\_\_();
next(a) a.__next__()a.\_\_\mathrm{next}\_\_();
bool(a) a.__bool__()a.\_\_\mathrm{bool}\_\_();
float(a) a.__float__()a.\_\_\mathrm{float}\_\_();
int(a) a.__int__()a.\_\_\mathrm{int}\_\_();
repr(a) a.__repr__()a.\_\_\mathrm{repr}\_\_();
reversed(a) a.__reversed__()a.\_\_\mathrm{reversed}\_\_();
str(a) a.__str__()a.\_\_\mathrm{str}\_\_();

這裏我舉一個小小的例子,創建一個類將其加法變減法,將減法變加法

class Num(object):
    def __init__(self,n):
        self.a = n
    def __add__(self, other):
        return self.a.__sub__(other)
    def __sub__(self, other):
        return self.a.__and__(other)
a = Num(5)
result1 = a + 5
result2 = a - 5
print('a+5=',result1)
print('a-5=',result2)

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章