Python __ixor__() 魔法方法

160 阅读5分钟

语法

object.__ixor__(self, other)

Python__ixor__() 魔法实现了就地的位数XOR x ^= y ,它计算了位数XOR操作的结果x ^ y ,并将其分配给第一个操作数的变量x 。这种类型的就地操作也被称为 增强的算术赋值.该方法只是返回要分配给第一个操作数的新值。

  • 当你调用x ^= y 时,Python 首先尝试调用x.__ixor__(y)
  • 如果这一点没有实现,它就会尝试正常的位和操作 [x.__xor__(y)](https://blog.finxter.com/python-__xor__-magic-method/ "Python __xor__() Magic Method").
  • 如果这一点也没有实现,它将尝试反向指数化操作 [y.__rxor__(x)](https://blog.finxter.com/python-__rxor__-magic-method/ "Python __rxor__() Magic Method")与互换的操作数。

然后将结果赋值给第一个操作数x 。如果这些操作都没有实现,Python 会引发一个TypeError

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

重写__ixor__的基本例子

在下面的代码例子中,你创建了一个类Data ,并定义了神奇的方法__ixor__(self, other)

  • "self"参数是每个方法的默认参数,它指的是被调用的对象--在我们的例子中,是就地操作的第一个操作数。
  • 原地方法的 "其他 "参数指的是第二个操作数,即原地操作中的y x ^= y

该操作的返回值返回一个假的字符串'finxter 42' ,并分配给第一个操作数。在实践中,这将是原地比特XOR操作的结果。

class Data:
    def __ixor__(self, other):
        return 'finxter 42'


x = Data()
y = Data()

x ^= y

print(x)
# finxter 42

就地XOR ^= 没有__ixor__()

为了支持自定义类上的就地比特XOR操作,你不需要覆盖__ixor__() 方法。因为如果这个方法没有被定义,Python 会回到正常的 [__xor__()](https://blog.finxter.com/python-__xor__-magic-method/ "Python __xor__() Magic Method")方法并将其结果分配给第一个操作数。

这里有一个例子。

class Data:
    def __xor__(self, other):
        return 'finxter 42'


x = Data()
y = Data()

x ^= y

print(x)
# finxter 42

尽管没有定义__ixor__() 方法,但由于__xor__() "回退 "魔法方法,就地位数XOR操作x ^= y 仍然有效!

没有__ixor__()和__xor__()的就地XOR ^=。

要在一个自定义类上支持就地的位 XORx ^= y ,你甚至不需要覆盖任何一个x.__ixor__(y)x.__xor__(y) 方法。如果这两个方法都没有定义,Python会回到反向的 [y.__rxor__(x)](https://blog.finxter.com/python-__rxor__-magic-method/ "Python __rxor__() Magic Method")方法并将其结果分配给第一个操作数。

这里有一个例子,你为第一个操作数创建了一个自定义类,它不支持位数XOR操作。然后你为第二个操作数定义一个自定义类,该类定义了__rxor__() 方法。对于就地操作,Python 回到了在第二个操作数上定义的__rxor__() 方法,并将其分配给第一个操作数x

class Data_1:
    pass

class Data_2:
    def __rxor__(self, other):
        return 'finxter 42'

x = Data_1()
y = Data_2()

x ^= y

print(x)
# finxter 42

TypeError: ^=的操作数类型不支持。

如果你试图执行原地位数ORx ^= y ,但是既没有定义x.__ixor__(y) ,也没有定义x.__xor__(y) ,更没有定义y.__rxor(x) ,Python会引发一个"TypeError: unsupported operand type(s) for ^=" 。要解决这个错误,只需在执行原地操作之前定义这些方法中的任何一个。

class Data:
    pass      # ... you should define __ixor__ here to prevent error! ... #


x = Data()
y = Data()

x ^= y

输出。

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 8, in <module>
    x ^= y
TypeError: unsupported operand type(s) for ^=: 'Data' and 'Data'

背景 位数XOR

Python的 位数XOR操作符x ^ y 在整数xy 的二进制表示上的每个位上执行逻辑 XOR当且仅当 同一位置的两个输入位中有一个正好是1时,每个输出位的值为1。

例如,整数表达式4 ^ 3 被翻译成二进制操作0100 ^ 0011 ,其结果是0111 ,因为对于最后三个位置,正好有一个位是1。

你可以在我们关于这个运算符的深入教程中了解更多。

相关视频 复合运算符

参考资料。

从哪里开始?

理论够多了,让我们进行一些实践吧!

要想在编码方面取得成功,你需要走出去,为真实的人解决真实的问题。这样你才能轻松成为六位数的收入者。而这也是你如何在实践中打磨出你真正需要的技能。毕竟,学习没有人需要的理论有什么用?

实践项目就是你在编码中磨练你的锯子的方法!

你想通过专注于实际的代码项目,成为一个代码大师,真正为你挣钱,为人们解决问题吗?

那就成为一名Python自由开发者吧!这是接近提高Python技能任务的最好方式--即使你是一个完全的初学者。

参加我的免费网络研讨会"如何建立你的高收入技能Python",看看我是如何在网上发展我的编码业务的,你也可以这样做--从你自己家里的舒适度。

现在就参加免费网络研讨会

The postPython __ixor__() Magic Methodfirst appeared onFinxter.