语法
object.__ilshift__(self, other)
Python__ilshift__() 魔法实现了就地的位数左移操作 x <<= y ,它计算左移操作 x << y ,并将结果分配给第一个操作数的变量名x 。这个操作也被称为 增强的算术赋值.该方法只是返回要分配给第一个操作数的新值。
- 当你调用
x <<= y时,Python 首先尝试调用x.__ilshift__(y)。 - 如果这一点没有实现,它就会尝试正常的位向左移操作
[x.__lshift__(y)](https://blog.finxter.com/python-__lshift__/ "Python __lshift__() Magic Method"). - 如果这一点也没有实现,它就会尝试反向的比特左移操作。
[y.__rlshift__(x)](https://blog.finxter.com/python-__rlshift__-magic-method/ "Python __rlshift__() Magic Method")与交换的操作数。
然后将结果赋值给第一个操作数x 。如果这些操作都没有实现,Python 会引发一个TypeError 。
我们把这称为 "Dunder Method",即*"Double UnderscoreMethod"(也称为"Magic Method")*。要获得所有带有解释的Dunder 方法的列表,请查看我们博客上的dunder cheat sheet 文章。
重写__ilshift__的基本例子
在下面的代码例子中,你创建了一个类Data ,并定义了神奇的方法__ilshift__(self, other) 。
- "self"参数是每个方法的默认参数,它指的是被调用的对象--在我们的例子中,是就地操作的第一个操作数。
- 原地方法的 "其他 "参数指的是第二个操作数,即原地操作中的
yx <<= y。
该操作的返回值返回一个假的字符串'finxter 42' ,并分配给第一个操作数。在实践中,这将是原地左移位操作的结果。
class Data:
def __ilshift__(self, other):
return 'finxter 42'
x = Data()
y = Data()
x <<= y
print(x)
# finxter 42
就地左移 << 没有 __ilshift__()
要在一个自定义类上支持原地左移,你不需要覆盖原地__ilshift__() 方法。因为如果这个方法没有被定义,Python 会退回到正常的__lshift__() 方法,并将其结果分配给第一个操作数。
这里有一个例子。
class Data:
def __lshift__(self, other):
return 'finxter 42'
x = Data()
y = Data()
x <<= y
print(x)
# finxter 42
即使没有定义__ilshift__() 方法,由于__lshift__() "回退 "的神奇方法,原地的位数左移操作x <<= y 仍然有效!
没有 __ilshift__() 和 __lshift__() 的就地矩阵乘法
要在一个自定义类上支持原地左移x <<= y ,你甚至不需要覆盖任何x.__ilshift__(y) 或x.__lshift__(y) 方法。如果这两个方法都没有定义,Python 会返回到反向的 [y.__rlshift__(x)](https://blog.finxter.com/python-__rlshift__-magic-method/ "Python __rlshift__() Magic Method")方法,并将其结果分配给第一个操作数。
这里有一个例子,你为第一个操作数创建了一个自定义类,它不支持顺时针左移操作。然后你为第二个操作数定义一个自定义类,该类定义了__rlshift__() 方法。对于原地操作,Python 返回到在第二个操作数上定义的__rlshift__() 方法,并把它赋给第一个操作数x 。
class Data_1:
pass
class Data_2:
def __rlshift__(self, other):
return 'finxter 42'
x = Data_1()
y = Data_2()
x <<= y
print(x)
# finxter 42
TypeError: <<=的操作数类型不支持
如果你试图执行原地乘法x <<= y ,但是既没有定义x.__ilshift__(y) ,也没有定义x.__lshift__(y) ,更没有定义y.__rlshift(x) ,Python 会引发一个 "TypeError: unsupported operand type(s) for <<="。要解决这个错误,只需在执行原地操作之前定义这些方法中的任何一个。
class Data:
pass
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'
背景位数左移
Python的 位数左移操作符x << n 将整数x 的二进制表示法向左移动n 位。对于一个正整数,它在右边插入一个0 位,并将所有剩余的位向左移动一个位置。例如,如果你将二进制表示0101 左移一个位置,你会得到01010 。从语义上讲,比特左移运算符x << n ,相当于将整数x 与2**n 相乘。
你可以在这里找到关于比特左移的完整教程(包括视频)。
相关视频
参考资料。
从哪里开始?
理论够多了,让我们进行一些实践吧!
要想在编码方面取得成功,你需要走出去,为真实的人解决真实的问题。这样你才能轻松成为六位数的收入者。而这也是你如何在实践中打磨出你真正需要的技能。毕竟,学习没有人需要的理论有什么用?
实践项目就是你在编码中磨练你的锯子的方法!
你想通过专注于实际的代码项目,成为一个代码大师,真正为你挣钱,为人们解决问题吗?
那就成为一名Python自由开发者吧!这是接近提高Python技能任务的最佳方式--即使你是一个完全的初学者。
参加我的免费网络研讨会"如何建立你的高收入技能Python",看看我是如何在网上发展我的编码业务的,你也可以这样做--从你自己家里的舒适度。
The postPython __ilshift__() Magic Methodfirst appeared onFinxter.