用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)

结果如下:
在这里插入图片描述

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