在Python 3里面,中文是可以作为变量名的,而运算符又可以重载,基于这两个特性,我们可以实现阿拉伯数字与中文数字的四则运算。
首先我们定义一个类 Num
:
class Num(object): def __init__(self, n): self.n = n def __repr__(self): return self.n def __str__(self): return str(self.n)
然后把这个类初始化为各个中文数字:
一 = Num(1) 五 = Num(5) 八 = Num(8)
运行效果如下图所示:
代码里面,通过实现 __repr__
,能实现在Jupyter或者Python命令行交互环境里面输入变量名回车就显示变量的值。
通过实现 __str__
,能实现在Python 里面 print(变量)
的时候打印出具体的值。
但现在还不够,当我们进行四则运算的时候,会报错:
为了能够正常实现 一+1
,我们需要实现 __add__
方法:
class Num(object): def __init__(self, n): self.n = n def __repr__(self): return str(self.n) def __str__(self): return str(self.n) def __add__(self, x): return self.n + x
运行效果如下图所示:
但是,如果我们把加号两侧的数字兑换一下,代码又报错了,如下图所示:
这是由于,当我们执行 a+b
的时候,Python会调用 a
对象里面的 __add__
方法,所以当我们执行 一+1
的时候,调用的是 一
里面的 __add__
方法,这是我们自己写的,所以能够正常运行。
但是当我们执行 1+一
的时候,调用的是 1
里面的 __add__
方法。在Python里面,数字对象里面的 __add__
方法只能实现数字加数字。
但是我们不能修改Python 内置数字的 __add__
方法,所以我们需要使用 __radd__
方法。它的作用是,在 1+一
执行的时候,如果 1
里面的 __add__
运行失败了,那么就会调用 一
里面的 __radd__
:
class Num(object): def __init__(self, n): self.n = n def __repr__(self): return str(self.n) def __str__(self): return str(self.n) def __add__(self, x): return self.n + x def __radd__(self, x): return self.n + x
运行效果如下图所示:
同样的原理,你可以自己实现减法 __sub__/__rsub__
、乘法 __mul__/__rmul__
和除法 __truediv__/__rtruediv__
。