Python __abs__() 语法
__abs__() 是 Python 的一个特殊方法(又称 “魔法方法” 或 “双下划线方法” ),它用于定义当对对象调用 abs() 函数时,如何返回其 “绝对值”。
语法:
class MyObject:
def __abs__(self):
# 返回对象的绝对值
# 必须返回一个数字(整数、浮点数或复数)
return abs(self._value)
说明:
__abs__() 方法不接收任何参数,除了 self(实例本身)。
__abs__() 方法必须返回一个数字类型的值(整数、浮点数或复数)。如果返回非数字类型,将导致 TypeError 异常。
注意:如果一个类实现了 __abs__() 方法,那么当对该类的实例调用 abs() 函数时,Python 会自动调用这个方法。
Python __abs__() 摘要
| 属于 | Python 魔法方法 |
|---|---|
| 使用频率 | 中 |
| 官方文档 | 查看 |
| 相关函数 | abs() |
Python __abs__() 示例
接下来,我们通过几个简单的例子来讲解一下 Python __abs__() 方法是如何使用的。
示例 1:对内置数值类型使用 abs()
# 对整数使用 abs()
print(abs(-5))
print(abs(10))
# 对浮点数使用 abs()
print(abs(-3.14))
print(abs(6.66))
运行结果如下。
5
10
3.14
6.66
分析:
对于内置的数值类型(如整数和浮点数),abs() 函数会直接返回其绝对值。这是因为这些内置类型已经内部实现了 __abs__() 方法。
示例 2:自定义类实现 __abs__()
class MyNumber:
def __init__(self, value):
self.value = value
def __abs__(self):
return abs(self.value) # 返回内部值的绝对值
def __str__(self):
return f'MyNumber({self.value})'
# 创建 MyNumber 实例
num1 = MyNumber(-10)
num2 = MyNumber(7)
num3 = MyNumber(-3.5)
# 对 MyNumber 实例使用 abs()
print(abs(num1))
print(abs(num2))
print(abs(num3))
运行结果如下。
10
7
3.5
分析:
在这个例子中,我们定义了一个 MyNumber 类,并为其实现了 __abs__() 方法。当对 MyNumber 实例调用 abs() 函数时,Python 会自动调用我们定义的 __abs__() 方法,并返回 self.value 的绝对值。
示例 3:__abs__() 计算向量的模
import math
class Vector2D:
def __init__(self, x, y):
self.x = x
self.y = y
def __abs__(self):
"""
计算二维向量的模(长度)
模长 = sqrt(x^2 + y^2)
"""
return math.sqrt(self.x**2 + self.y**2)
def __str__(self):
return f'Vector2D({self.x}, {self.y})'
# 创建 Vector2D 实例
vec1 = Vector2D(3, 4)
vec2 = Vector2D(-5, 12)
vec3 = Vector2D(0, 0)
# 对 Vector2D 实例使用 abs()
print(abs(vec1))
print(abs(vec2))
print(abs(vec3))
运行结果如下。
5.0
13.0
0.0
分析:
在这个例子中,我们自定义了 __abs__() 方法来计算二维向量。其中,向量的 “绝对值” 被定义为其模长(即从原点到向量末端的距离)。通过实现 __abs__() 方法,可以使得 abs(Vector2D(…)) 能够直观地返回向量的模长。
示例 4:未实现 __abs__() 的自定义类
class MyObject:
def __init__(self, value):
self.value = value
obj = MyObject(100)
try:
print(abs(obj))
except TypeError as e:
print(e)
运行结果如下。
(报错)bad operand type for abs(): 'MyObject'
分析:
如果一个自定义类没有实现 __abs__() 方法,然后我们还对其实例调用 abs() 函数的话,此时 Python 就会抛出 TypeError 异常,表示该类型不支持 abs() 操作。
