Python __abs__() 方法

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() 操作。

上一篇: __ge__()

下一篇: Python 内置函数

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号