本例中未完整实现数字类型的全部计算运算符,实现全部数学运算符后即可作为鸭子类型在Python中当做普通数字进行计算。
如果只是临时计算,使用类中的 self.value 参数也可参与计算。
实现原理:
其中 self.add 用于记录数字被使用的求正/求负运算符的状态。当已被同类型运算符操作过一次后,第二次使用运算符时产生自增/自减效果。
需注意使用一次求负运算符后除了要记录运算符状态,还要产生负数效果,连续第二次使用求负运算符后清除负号状态,同时自减一。
实现代码: - class MyInt:
- def __init__(self, value, add=0):
- self.add = add
- self.value = value
- def __pos__(self):
- add = self.add == 1
- return MyInt(self.value + add, 1 - add)
- def __neg__(self):
- add = self.add == -1
- return MyInt(-self.value - add, add - 1)
- def __repr__(self):
- return str(self.value)
- def __eq__(self, other):
- return self.value == other
复制代码以及测试代码: - i = MyInt(1)
- print('\n测试原本数据:')
- print(f'{i = }') # 1
- print('\n测试求正、自增、自增后求正、连续自增:')
- print(f'{+i = }') # 1
- print(f'{++i = }') # 2
- print(f'{+++i = }') # 2
- print(f'{++++i = }') # 3
- print('\n测试求负、自减、自减后求负、连续自减:')
- print(f'{-i = }') # -1
- print(f'{--i = }') # 0
- print(f'{---i = }') # 0
- print(f'{----i = }') # -1
- print(f'{-----i = }') # 1
- print(f'{------i = }') # -2
- print('\n测试混合使用求正、求负、自增、自减:')
- print(f'{+-i = }') # -1
- print(f'{-+i = }') # -1
- print(f'{+-+-i = }') # 1
- print(f'{-+-+i = }') # 1
- print(f'{++--i = }') # 1
- print(f'{--++i = }') # 1
- print(f'{+--+i = }') # 0
- print(f'{-++-i = }') # 0
复制代码需要注意的是,++i 没有实现「自」增的效果,也就是数据 i 没有原地修改。
因为在Python中 ++i 和 (+(+i)) 是完全等效的操作,然而在C语言中这两种的算计方法果结是不同的。
本质原因是在C语言中这是2个运算符,而在Python中是1运个算符。所以这是无法解决的问题。
以及 i++ 和 i-- 这样的后置运算符,那就更没有办法实现啦。 |