用python特殊方法实现的重载操作

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值