举例说明Python __abs__()的方法

793 阅读1分钟

语法

object.__abs__()

Python 的object.__abs__() 方法返回object 的绝对值,并实现了内置函数 [abs()](https://blog.finxter.com/python-abs/ "Python abs() Function").

任何数字输入参数-x+x 的绝对值都是相应的正值+x 。然而,你可以通过定义一个自定义的__abs__() 方法来覆盖默认的行为。

我们称这种方法为*"* Dunder Method",即*"Double Underscore* Method"。

例子

在下面的例子中,你创建了一个自定义类Data ,并覆盖了__abs__() 方法,使其将属性self.value 乘以10。

class Data:

    def __init__(self, value):
        self.value = value
        
    def __abs__(self):
        return self.value * 10


my_value = Data(4.2)
print(abs(my_value))
# 42.0

如果你没有定义__abs__() 方法,Python 会产生一个TypeError

如何解决TypeError:abs()的操作数类型不好:'Data'。

考虑一下下面的代码片段,你试图在一个自定义对象上调用内置函数 [abs()](https://blog.finxter.com/python-abs/ "Python abs() Function")在一个自定义对象上。

class Data:

    def __init__(self, value):
        self.value = value


my_value = Data(4.2)
print(abs(my_value))

在我的电脑上运行这个导致了以下错误信息。

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 8, in <module>
    print(abs(my_value))
TypeError: bad operand type for abs(): 'Data'

这个错误的原因是:__abs__() dunder 方法从未被定义过--而且默认情况下,它没有为自定义对象定义。因此,为了解决TypeError: bad operand type for abs() ,你需要在你的类定义中提供__abs__(self) 方法,如前所示。

class Data:

    def __init__(self, value):
        self.value = value
        
    def __abs__(self):
        return self.value * 10


my_value = Data(4.2)
print(abs(my_value))
# 42.0