龙空技术网

python运算符重载之字符串显示和右侧加法

梯阅线条 12

前言:

今天姐妹们对“python字符串加减”大致比较讲究,我们都想要剖析一些“python字符串加减”的相关文章。那么小编在网上汇集了一些对于“python字符串加减””的相关内容,希望朋友们能喜欢,咱们一起来学习一下吧!

1.1 重载字符串显示1.1.1 str和repr

python调用prin()t时,自动调用strrepr

python调用str()时,自动调用strrepr

python调用repr()时,自动调用repr,不调用 str

终端用str,开发时用repr

自定义strrepr时,必须返回字符串。

 >>> class MyAdd:     def __init__(self,value=0):         self.data=value     def __add__(self,other):         self.data+=other >>> class MyAddRepr(MyAdd):     def __repr__(self):         return 'MyAddRepr({})'.format(self.data) >>> ma=MyAdd(1) >>> print(ma) <__main__.MyAdd object at 0x03869C90>  >>> mar=MyAddRepr(1) # print 自动调用 __repr__ >>> print(mar) MyAddRepr(1) # str repr 自动调用 __repr__ >>> str(mar),repr(mar) ('MyAddRepr(1)', 'MyAddRepr(1)')  >>> class MyAddStr(MyAdd):     def __str__(self):         return 'MyAddStr({})'.format(self.data) >>> mas=MyAddStr(2) # print 自动调用 __str__ >>> print(mas) MyAddStr(2) # str 自动调用 __str__ # repr 不会调用 __str__ >>> str(mas),repr(mas) ('MyAddStr(2)', '<__main__.MyAddStr object at 0x03869CD0>')  >>> class MyAddBoth(MyAdd):     def __str__(self):         return 'MyAddBothstr({})'.format(self.data)     def __repr__(self):         return 'MyAddBothrepr({})'.format(self.data)       >>> mab=MyAddBoth(3) # print str 自动调用 __str__ # repr 自动调用 __repr__ >>> print(mab) MyAddBothstr(3) >>> str(mab),repr(mab) ('MyAddBothstr(3)', 'MyAddBothrepr(3)')
1.1.2 自定义repr

当print对象在顶层时会调用自定义str,非顶层时调用默认调用内容或调用repr

所以,建议自定义repr,来统一拦截print(),str(),repr()操作。

 >>> class MyPrintStr:     def __init__(self,val):         self.val=val     def __str__(self):         return str(self.val) >>> class MyPrintRepr:     def __init__(self,val):         self.val=val     def __repr__(self):         return str(self.val) # 实例非顶层时print时用默认打印,或者repr,而不会用str >>> mpsl=[MyPrintStr(1),MyPrintStr(2)] >>> mprl=[MyPrintRepr(1),MyPrintRepr(2)] >>> print(mpsl) [<__main__.MyPrintStr object at 0x009F8370>, <__main__.MyPrintStr object at 0x009F8430>] >>> print(mprl) [1, 2]
1.2 重载右侧和原处加法

1.2.1 radd

实例在加号左侧,自动调用 add

实例在加号右侧,自动调用 radd

 >>> class MyRadd:     def __init__(self,val):         self.val = val     def __add__(self,other):         print('add',self.val,other)         return self.val+other     def __radd__(self,other):         print('radd',self.val,other)         return other+self.val >>> x=MyRadd(8) >>> y=MyRadd(9) # 实例 在加号左边, 自动调用 __add__ >>> x+1 add 8 1 9 # 实例 在加号右边, 自动调用 __radd__ >>> 1+y radd 9 1 10 # 两个实例相加时, 先调用 add 再调用 radd >>> x+y add 8 <__main__.MyRadd object at 0x00A23A30> radd 9 8 17  # return 类实例时,需要类型测试isinstance,避免嵌套循环 >>> class MyRaddIf:     def __init__(self,val):         self.val = val     def __add__(self,other):         print('add',self.val,other)         if isinstance(other,MyRaddIf):             other=other.val         return MyRaddIf(self.val+other)     def __radd__(self,other):         print('radd',self.val,other)         return MyRaddIf(other+self.val)     def __repr__(self):         return '<MyRaddIf:{}>'.format(self.val)       >>> x=MyRaddIf(8) >>> y=MyRaddIf(9) >>> print(x+10) add 8 10 <MyRaddIf:18> >>> print(10+y) radd 9 10 <MyRaddIf:19> >>> z=x+y add 8 <MyRaddIf:9> >>> print(z) <MyRaddIf:17> #>>> print(z)#注释 if isinstance(other,MyRaddIf) 时,发生嵌套 #<MyRaddIf:<MyRaddIf:17>> >>> print(z+10) add 17 10 <MyRaddIf:27> >>> print(z+z) add 17 <MyRaddIf:17> <MyRaddIf:34> >>> class MyRadd:     def __init__(self,val):         self.val = val     def __add__(self,other):         print('add',self.val,other)         return self.val+other >>> x=MyRadd(8) >>> x+1 add 8 1 9 # 没有radd时,实例在右侧会报错 >>> 1+x Traceback (most recent call last):   File "<pyshell#127>", line 1, in <module>     1+x TypeError: unsupported operand type(s) for +: 'int' and 'MyRadd' 

1.2.2 iadd

python的+=优先调用iadd_,没有再调用_add__。

 >>> class MyIadd:     def __init__(self,val):         self.val=val     def __iadd__(self,other):         self.val+=other         return self # += 调用 __add__ >>> x=MyIadd(5) >>> x+=1 >>> x.val 6 >>> class MyIadd:     def __init__(self,val):         self.val=val     def __add__(self,other):         self.val+=other         return self # += 调用 __add__ >>> x=MyIadd(5) >>> x+=1 >>> x.val 6 >>> class MyIadd:     def __init__(self,val):         self.val=val     def __add__(self,other):         print('__add__')         self.val+=other         return self     def __iadd__(self,other):         print('__iadd__')         self.val+=other         return self # += 优先调用 __iadd__ >>> x=MyIadd(5) >>> x+=1 __iadd__

2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

标签: #python字符串加减 #字符串数字加法