语法
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