使用Python __irshift__() ,实现算数赋值

561 阅读4分钟

语法

object.__irshift__(self, other)

Python__irshift__() 神奇地实现了就地顺位右移操作,它计算了右移操作,并将结果分配给第一个操作数变量x 。这个操作也被称为 增强的算术赋值.该方法只是返回要分配给第一个操作数的新值。

  • 当你调用x >>= y 时,Python 首先会尝试调用x.__irshift__(y)
  • 如果这一点没有实现,它就会尝试正常的位向左移操作 [x.__rshift__(y)](https://blog.finxter.com/python-__rshift__/ "https://blog.finxter.com/python-__rshift__/").
  • 如果这一点也没有实现,它就会尝试反向的左移位操作。 [y.__rrshift__(x)](https://blog.finxter.com/python-__rrshift__-magic-method/ "Python __rrshift__() Magic Method")与交换的操作数。

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

我们把这称为 "Dunder Method",即_"Double UnderscoreMethod"(也称为"Magic Method"_)。

重写__irshift__的基本例子

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

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

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

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


x = Data()
y = Data()

x >>= y

print(x)
# finxter 42

就地右移 >> 没有 __irshift__()

要在一个自定义类上支持就地右移,你不必覆盖就地__irshift__() 方法。因为如果这个方法没有被定义,Python 会返回到正常的 [__rshift__()](https://blog.finxter.com/python-__rshift__/ "https://blog.finxter.com/python-__rshift__/")方法并将其结果分配给第一个操作数。

这里有一个例子。

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


x = Data()
y = Data()

x >>= y

print(x)
# finxter 42

尽管没有定义__irshift__() 方法,但由于__rshift__() "回退 "魔法方法,原位顺时针左移操作x >>= y 仍然有效!

没有__irshift__()和__rshift__()的就地位数右移操作

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

这里有一个例子,你为第一个操作数创建了一个自定义类,它不支持顺时针右移操作。然后你为第二个操作数定义一个自定义类,该类定义了__rrshift__() 方法。对于原地操作,Python 返回到在第二个操作数上定义的__rrshift__() 方法,并把它赋给第一个操作数x

class Data_1:
    pass

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

x = Data_1()
y = Data_2()

x >>= y

print(x)
# finxter 42

TypeError: >>=的操作数类型不受支持

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

class Data:
    pass


x = Data()
y = Data()

x >>= y

输出

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

位数右移

Python的 位数右移操作符x >> n 将整数x 的二进制表示法向右移动了n 位。

它在左边插入一个0 位,并删除最右边的位。例如,如果你把二进制表示法0101 右移一个位置,你会得到0010

从语义上讲,比特右移运算符与执行整数除以2**n

Python Bitwise Right-Shift >> Operator

你可以在这里找到一个关于顺时针右移的完整教程(包括视频)。

从哪里开始?

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

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

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

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

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