【发布时间】:2014-01-20 20:42:50
【问题描述】:
有一个代码,在类的方法中有一行:
object.attribute |= variable
我不明白这是什么意思。我在基本 Python 运算符列表中没有找到 (|=)。
【问题讨论】:
标签: python python-2.7 operators
有一个代码,在类的方法中有一行:
object.attribute |= variable
我不明白这是什么意思。我在基本 Python 运算符列表中没有找到 (|=)。
【问题讨论】:
标签: python python-2.7 operators
【讨论】:
在 python 中,| 是调用对象的__or__ 方法的简写,如here in the docs 和此代码示例所示:
class Object(object):
def __or__(self, other):
print("Using __or__")
让我们看看将| 运算符与这个通用对象一起使用时会发生什么。
In [62]: o = Object()
In [63]: o | o
using __or__
如您所见,__or__ 方法被调用。 int、'set'、'bool' 都有__or__ 的实现。对于数字和布尔值,它是按位或。对于集合,它是一个联合。因此,根据属性或变量的类型,行为会有所不同。许多位运算符都设置了等效项see more here。
【讨论】:
我应该补充一点,“bar-equals”现在(在 2018 年)最流行地用作集合并集运算符,用于将不存在的元素附加到集合中。
>>> a = {'a', 'b'}
>>> a
set(['a', 'b'])
>>> b = {'b', 'c'}
>>> b
set(['c', 'b'])
>>> a |= b
>>> a
set(['a', 'c', 'b'])
这方面的一个用例,例如在自然语言处理中,是提取几种语言的组合字母表:
alphabet |= {unigram for unigram in texts['en']}
alphabet |= {unigram for unigram in texts['de']}
...
【讨论】:
对于整数,这对应于 Python 的“按位或”方法。所以在下面的例子中,我们取 4 和 1 的按位或得到 5(或二进制 100 | 001 = 101):
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 4
>>> bin(a)
'0b100'
>>> a |= 1
>>> bin(a)
'0b101'
>>> a
5
更一般化(如 Alejandro 所说)是调用对象的 or 方法,可以为类定义如下形式:
def __or__(self, other):
# your logic here
pass
因此,在整数的特定情况下,我们调用 or 方法,该方法解析为 Python 定义的按位或。
【讨论】: