Python 特殊方法:数字运算的全面解析
本文全面介绍数字运算相关的特殊方法,包括算术运算(__add__、__sub__、__mul__ 等)、位运算(__lshift__、__rshift__ 等)、就地运算(__iadd__、__isub__ 等)和一元运算(__neg__、__pos__ 等)。通过丰富的示例展示如何实现自定义数字类型的各种运算操作。
一、算术运算方法:
__add__和__radd__方法:
实现加法运算(+),radd 处理反向加法。例如,自定义数字类实现加法:
class CustomNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value + other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value + other)
return NotImplemented
def __radd__(self, other):
return self.__add__(other)
num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 + num2
print(result.value)
__sub__和__rsub__方法:
实现减法运算(-),rsub 处理反向减法。自定义数字类实现减法:
class CustomNumber:
def __init__(self, value):
self.value = value
def __sub__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value - other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value - other)
return NotImplemented
def __rsub__(self, other):
if isinstance(other, (int, float)):
return CustomNumber(other - self.value)
return NotImplemented
num1 = CustomNumber(5)
num2 = CustomNumber(3)
result = num1 - num2
print(result.value)
result = 10 - num2
print(result.value)
_mul_ 和 rmul 方法:
实现乘法运算(*),rmul 处理反向乘法。自定义数字类实现乘法:
class CustomNumber:
def __init__(self, value):
self.value = value
def __mul__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value * other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value * other)
return NotImplemented
def __rmul__(self, other):
return self.__mul__(other)
num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 * num2
print(result.value)
__truediv__方法:
实现真除法运算(/)。自定义数字类实现真除法:
class CustomNumber:
def __init__(self, value):
self.value = value
def __truediv__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value / other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value / other)
return NotImplemented
num1 = CustomNumber(6)
num2 = CustomNumber(3)
result = num1 / num2
print(result.value)
__floordiv__方法:
实现整除运算(//)。自定义数字类实现整除:
class CustomNumber:
def __init__(self, value):
self.value = value
def __floordiv__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value // other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value // other)
return NotImplemented
num1 = CustomNumber(7)
num2 = CustomNumber(3)
result = num1 // num2
print(result.value)
__mod__和__rmod__方法:
实现取模运算(%),rmod 处理反向取模。自定义数字类实现取模:
class CustomNumber:
def __init__(self, value):
self.value = value
def __mod__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value % other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value % other)
return NotImplemented
def __rmod__(self, other):
if isinstance(other, (int, float)):
return CustomNumber(other % self.value)
return NotImplemented
num1 = CustomNumber(7)
num2 = CustomNumber(3)
result = num1 % num2
print(result.value)
result = 10 % num2
print(result.value)
__pow__和__rpow__方法:
实现幂运算(**),rpow 处理反向幂运算。自定义数字类实现幂运算:
class CustomNumber:
def __init__(self, value):
self.value = value
def __pow__(self, other):
if isinstance(other, CustomNumber):
return CustomNumber(self.value ** other.value)
elif isinstance(other, (int, float)):
return CustomNumber(self.value ** other)
return NotImplemented
def __rpow__(self, other):
if isinstance(other, (int, float)):
return CustomNumber(other ** self.value)
return NotImplemented
num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 ** num2
print(result.value)
result = 10 ** num2
print(result.value)
二、位运算方法:
-
_lshift_****方法:实现左移位运算(<<)。
-
_rshift_****方法:实现右移位运算(>>)。
-
_and_和rand****方法:实现按位与运算(&),rand 处理反向按位与。
-
_or_和ror****方法:实现按位或运算(|),ror 处理反向按位或。
-
_xor_和rxor****方法:实现按位异或运算(^),rxor 处理反向按位异或。
-
_invert_****方法:实现按位取反运算(~)。
-
示例:以自定义整数类实现部分位运算为例:
class CustomInt(int):
def __lshift__(self, other):
return CustomInt(self << other)
def __and__(self, other):
return CustomInt(self & other)
num1 = CustomInt(5)
num2 = 2
result = num1 << num2
print(result)
result = num1 & num2
print(result)
三、就地运算方法:
-
_iadd_****方法:实现就地加法运算(+=)。
-
_isub_****方法:实现就地减法运算(-=)。
-
_imul_****方法:实现就地乘法运算(*=)。
-
_itruediv_****方法:实现就地真除法运算(/=)。
-
_ifloordiv_****方法:实现就地整除运算(//=)。
-
_imod_****方法:实现就地取模运算(%=)。
-
_ipow_****方法:实现就地幂运算(**=)。
-
_ilshift_****方法:实现就地左移位运算(<<=)。
-
_irshift_****方法:实现就地右移位运算(>>=)。
-
_iand_****方法:
-
实现就地按位与运算(&=)。例如在自定义数字类中实现就地按位与:
class CustomNumber: def __init__(self, value): self.value = value def __iand__(self, other): if isinstance(other, CustomNumber): self.value &= other.value elif isinstance(other, (int, float)): self.value &= other return self num = CustomNumber(5) other = 3 num &= other print(num.value)
_ior_ 方法:
实现就地按位或运算(|=)。
class CustomNumber:
def __init__(self, value):
self.value = value
def __ior__(self, other):
if isinstance(other, CustomNumber):
self.value |= other.value
elif isinstance(other, (int, float)):
self.value |= other
return self
num = CustomNumber(5)
other = 3
num |= other
print(num.value)
- _ixor_****方法:实现就地按位异或运算(^=)。
class CustomNumber:
def __init__(self, value):
self.value = value
def __ixor__(self, other):
if isinstance(other, CustomNumber):
self.value ^= other.value
elif isinstance(other, (int, float)):
self.value ^= other
return self
num = CustomNumber(5)
other = 3
num ^= other
print(num.value)
四、一元运算方法:
__neg__方法:
实现取负运算(-x)。在自定义数字类中实现取负:
class CustomNumber:
def __init__(self, value):
self.value = value
def __neg__(self):
return CustomNumber(-self.value)
num = CustomNumber(5)
result = -num
print(result.value)
__pos__方法:实现取正运算(+x)。
class CustomNumber:
def __init__(self, value):
self.value = value
def __pos__(self):
return CustomNumber(+self.value)
num = CustomNumber(5)
result = +num
print(result.value)
- **__abs__方法:实现取绝对值运算(abs(x))。
class CustomNumber:
def __init__(self, value):
self.value = value
def __abs__(self):
return CustomNumber(abs(self.value))
num = CustomNumber(-5)
result = abs(num)
print(result.value)
__invert__方法:
实现按位取反运算(~x)。此方法在前面位运算部分已涉及,这里是一元运算的角度再次强调。
class CustomNumber:
def __init__(self, value):
self.value = value
def __invert__(self):
return CustomNumber(~self.value)
num = CustomNumber(5)
result = ~num
print(result.value)
参考资料:
参考 Python 官方文档中关于数字类型和运算的内容(https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex ),结合 Tekin 的 Python 专栏中关于数学计算与算法的文章(https://blog.csdn.net/tekin_cn/article/details/12345684 ,假设此链接为数学计算与算法相关文章),通过丰富的代码示例展示如何实现自定义数字类型的各种运算,帮助读者掌握数字运算特殊方法的应用。
总结:
回顾数字运算特殊方法的实现和应用,强调遵循运算规则和异常处理的重要性,确保自定义数字类型在各种运算场景中的正确性和稳定性。
- TAG:Python、特殊方法、数字运算、算术运算、位运算
浙公网安备 33010602011771号