用python特殊方法实现的重载操作
python的内置内为许多操作提供了自然的语义。比如,a+b语句可以调用数值类型语句,也可以是连接序列类型。
默认情况下,对于新定义的类来说,‘+’操作符是未定义的。然而,我们可以通过操作符重载技术来定义。这个定义可通过一个特殊的命名方法来实现。特别的是,名为
_
_
a
d
d
_
_
\_\_\mathrm{add}\_\_
__add__(这里两条下划线)的方法重载+操作符,
_
_
a
d
d
_
_
\_\_\mathrm{add}\_\_
__add__用右边的操作作为参数并返回表示表达式的结果。也就是说,a+b语句,被转化为一个调用a.
_
_
a
d
d
_
_
\_\_\mathrm{add}\_\_
__add__(b)对象的方法。
这里提供一个与这个类似的全部特殊方法重载操作的表格
常见的语法 | 特别方法的形式 |
---|---|
a+b | a . _ _ a d d _ _ ( b ) a.\_\_\mathrm{add}\_\_(b) a.__add__(b); 或者 b . _ _ r a d d _ _ ( a ) b.\_\_\mathrm{radd}\_\_(a) b.__radd__(a) |
a-b | a . _ _ s u b _ _ ( b ) a.\_\_\mathrm{sub}\_\_(b) a.__sub__(b); 或者 b . _ _ r s u b _ _ ( a ) b.\_\_\mathrm{rsub}\_\_(a) b.__rsub__(a) |
a*b | a . _ _ m u l _ _ ( b ) a.\_\_\mathrm{mul}\_\_(b) a.__mul__(b); 或者 b . _ _ r m u l _ _ ( a ) b.\_\_\mathrm{rmul}\_\_(a) b.__rmul__(a) |
a/b | a . _ _ t r u e d i v _ _ ( b ) a.\_\_\mathrm{truediv}\_\_(b) a.__truediv__(b); 或者 b . _ _ r t r u e d i v _ _ ( a ) b.\_\_\mathrm{rtruediv}\_\_(a) b.__rtruediv__(a) |
a//b | a . _ _ f l o o r d i v _ _ ( b ) a.\_\_\mathrm{floordiv}\_\_(b) a.__floordiv__(b); 或者 b . _ _ r f l o o r d i v _ _ ( a ) b.\_\_\mathrm{rfloordiv}\_\_(a) b.__rfloordiv__(a) |
a%b | a . _ _ m o d _ _ ( b ) a.\_\_\mathrm{mod}\_\_(b) a.__mod__(b); 或者 b . _ _ m o d _ _ ( a ) b.\_\_\mathrm{mod}\_\_(a) b.__mod__(a) |
a**b | a . _ _ p o w _ _ ( b ) a.\_\_\mathrm{pow}\_\_(b) a.__pow__(b); 或者 b . _ _ r p o w _ _ ( a ) b.\_\_\mathrm{rpow}\_\_(a) b.__rpow__(a) |
a<<b | a . _ _ l s h i f t _ _ ( b ) a.\_\_\mathrm{lshift}\_\_(b) a.__lshift__(b); 或者 b . _ _ r s h i f t _ _ ( a ) b.\_\_\mathrm{rshift}\_\_(a) b.__rshift__(a) |
a>>b | a . _ _ r s h i f t _ _ ( b ) a.\_\_\mathrm{rshift}\_\_(b) a.__rshift__(b); 或者 b . _ _ r r s h i f t _ _ ( a ) b.\_\_\mathrm{rrshift}\_\_(a) b.__rrshift__(a) |
a&b | a . _ _ a n d _ _ ( b ) a.\_\_\mathrm{and}\_\_(b) a.__and__(b); 或者 b . _ _ r a n d _ _ ( a ) b.\_\_\mathrm{rand}\_\_(a) b.__rand__(a) |
a^b | a . _ _ x o r _ _ ( b ) a.\_\_\mathrm{xor}\_\_(b) a.__xor__(b); 或者 b . _ _ r x o r _ _ ( a ) b.\_\_\mathrm{rxor}\_\_(a) b.__rxor__(a) |
a|b | a . _ _ o r _ _ ( b ) a.\_\_\mathrm{or}\_\_(b) a.__or__(b); 或者 b . _ _ r o r _ _ ( a ) b.\_\_\mathrm{ror}\_\_(a) b.__ror__(a) |
a+=b | a . _ _ i a d d _ _ ( b ) a.\_\_\mathrm{iadd}\_\_(b) a.__iadd__(b); |
a-=b | a . _ _ i s u b _ _ ( b ) a.\_\_\mathrm{isub}\_\_(b) a.__isub__(b); |
a*=b | a . _ _ i m u l _ _ ( b ) a.\_\_\mathrm{imul}\_\_(b) a.__imul__(b); |
+a | a . _ _ p o s _ _ ( b ) a.\_\_\mathrm{pos}\_\_(b) a.__pos__(b); |
-a | a . _ _ n e g _ _ ( b ) a.\_\_\mathrm{neg}\_\_(b) a.__neg__(b); |
~a | a . _ _ i n v e r t _ _ ( b ) a.\_\_\mathrm{invert}\_\_(b) a.__invert__(b); |
abs(a) | a . _ _ a b s _ _ ( b ) a.\_\_\mathrm{abs}\_\_(b) a.__abs__(b); |
a<b | a . _ _ l t _ _ ( b ) a.\_\_\mathrm{lt}\_\_(b) a.__lt__(b); |
a<=b | a . _ _ l e _ _ ( b ) a.\_\_\mathrm{le}\_\_(b) a.__le__(b); |
a>b | a . _ _ g t _ _ ( b ) a.\_\_\mathrm{gt}\_\_(b) a.__gt__(b); |
a>=b | a . _ _ g e _ _ ( b ) a.\_\_\mathrm{ge}\_\_(b) a.__ge__(b); |
a==b | a . _ _ e q _ _ ( b ) a.\_\_\mathrm{eq}\_\_(b) a.__eq__(b); |
a!=b | a . _ _ n e _ _ ( b ) a.\_\_\mathrm{ne}\_\_(b) a.__ne__(b); |
v in a | a . _ _ c o n t a i n s _ _ ( v ) a.\_\_\mathrm{contains}\_\_(v) a.__contains__(v); |
a[k] | a . _ _ g e t i t e m _ _ ( b ) a.\_\_\mathrm{getitem}\_\_(b) a.__getitem__(b); |
a[k]=v | a . _ _ s e t i t e m _ _ ( b ) a.\_\_\mathrm{setitem}\_\_(b) a.__setitem__(b); |
del a[k] | a . _ _ t r u e d i v _ _ ( k ) a.\_\_\mathrm{truediv}\_\_(k) a.__truediv__(k); |
a(arg 1,arg 2, ⋯ \cdots ⋯,… | a . _ _ c a l l _ _ ( a r g 1 , a r g 2 , ⋯ ) a.\_\_\mathrm{call}\_\_(arg1,arg2,\cdots) a.__call__(arg1,arg2,⋯); |
len(a) | a . _ _ l e n _ _ ( ) a.\_\_\mathrm{len}\_\_() a.__len__(); |
hash(a) | a . _ _ h a s h _ _ ( ) a.\_\_\mathrm{hash}\_\_() a.__hash__(); |
iter(a) | a . _ _ i t e r _ _ ( ) a.\_\_\mathrm{iter}\_\_() a.__iter__(); |
next(a) | a . _ _ n e x t _ _ ( ) a.\_\_\mathrm{next}\_\_() a.__next__(); |
bool(a) | a . _ _ b o o l _ _ ( ) a.\_\_\mathrm{bool}\_\_() a.__bool__(); |
float(a) | a . _ _ f l o a t _ _ ( ) a.\_\_\mathrm{float}\_\_() a.__float__(); |
int(a) | a . _ _ i n t _ _ ( ) a.\_\_\mathrm{int}\_\_() a.__int__(); |
repr(a) | a . _ _ r e p r _ _ ( ) a.\_\_\mathrm{repr}\_\_() a.__repr__(); |
reversed(a) | a . _ _ r e v e r s e d _ _ ( ) a.\_\_\mathrm{reversed}\_\_() a.__reversed__(); |
str(a) | a . _ _ s t r _ _ ( ) a.\_\_\mathrm{str}\_\_() a.__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)
结果如下: