Python的__invert__()函数使用方法

543 阅读2分钟

语法

object.__invert__(self)

Python__invert__() 方法实现了单项算术运算的位数NOT~因此,当你调用~x 时,Python 将在内部调用x.__invert__() 来获得反转的对象。如果这个方法没有实现,Python 将引发一个TypeError

我们把这称为 "Dunder Method",即*"Double UnderscoreMethod"(也叫"Magic Method")*。要获得所有带有解释的Dunder 方法的列表,请查看我们博客上的dunder cheat sheet 文章

背景位数NOT ~

Python的顺时针NOT运算符~x ,将整数x 的二进制表示法中的每一位倒置,使0变成1,1变成0。这在语义上与计算~x == -x-1 相同。例如,bitwise NOT表达式~0 变成-1~9 变成-10~32 变成-33

例子 自定义__invert__()

在下面这个最小的例子中,你创建了一个自定义类Data ,并覆盖了__invert__() 的魔法方法,这样它在试图计算位数非运算的时候就会返回一个假字符串。

class Data:
        
    def __invert__(self):
        return 'finxter'


x = Data()
print(~x)
# finxter

如果你没有定义__invert__() 方法,Python 会提出一个TypeError

TypeError:单数~的操作数类型不好:'...'。

考虑下面的代码片段,你试图在没有定义dunder方法的情况下对自定义对象进行位数NOT运算__invert__()

class Data:
    pass


x = Data()
print(~x)

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

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

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

class Data:
        
    def __invert__(self):
        return 'finxter'


x = Data()
print(~x)
# finxter