在对象创建中管道角色

时间:2018-06-12 21:41:22

标签: python python-3.x

我遇到了以下代码:

f = wx.Frame(None, -1, 'Window Title', style = wx.MAXMIZE_BOX | wx.SYSTEM_MENU)

我已经在Stack Overflow上读到了关于此问题的其他答案,其中说'|'与按位操作有关但我不认为这是在这里使用,如果它是我不理解它。在这种情况下,有人可以解释这个角色的用途吗?

1 个答案:

答案 0 :(得分:4)

按位或真正 在这里使用。

wx.MAXIMIZE_BOXwx.SYSTEM_MENU等都是整数常量,只设置了一个位。 (每个常量的不同位。)因此,您可以按位或者它们一起获取位集合。

这几乎就像在集合上进行联合操作一样。事实上,在Python中,set union 拼写为|。不同之处在于,当您使用单位整数时,整个集合适合单个固定大小的整数,而不是存储为一堆单独的值的集合。对于Python来说,这通常不是那么重要,但对于wx处理的低级窗口API(主要用C语言编写)来说,它是 - 或者至少是用来做的。

让我们举一个更简单的例子:

>>> a = 0b00000001
>>> b = 0b00000010
>>> c = 0b00000100
>>> d = 0b00001000
>>> acd = a | c | d
>>> bin(acd) # notice that the a, c, and d bits are all set, but no others
'0b1101'
>>> bool(acd & c) # is c an element of acd?
True
>>> bool(acd & b) # is b an element of acd?
False

所以我可以在一个字节中传递一组8个独立的布尔值。好吧,这是Python,“单字节”仍然是指向28字节int对象的8字节指针,其底层值的最小大小为4字节,所以我真的只是把事情做得更慢了更复杂,最小的空间利益。但是,如果你需要存储数以万计的......

无论如何,正如我们使用|,按位或意为联合一样,我们使用&,按位,并表示交集。

bool(… & …)可能有点令人困惑,直到你意识到一个集合与单个元素的交集是单个元素(如果它是集合的成员),或0(如果不是) 。在Python中,0总是假的,所有其他数字总是真的。

正如三元组在评论中指出的那样,当您的值都是单位值且没有重复时,|+实际上会做同样的事情:

>>> bin(a | c | d)
'0b1101'
>>> bin(a + c + d)
'0b1101'

考虑一下你如何在纸上添加东西然后进行1.按位或者就像添加列并忽略进位一样。因此,当没有进位时(因为我们没有任何位出现多次),它们会做同样的事情。当然,一旦这不再是真的,携带1而忽略1则不再相同:

>>> bin(acd | c)
'0b1101'
>>> bin(acd + c)
'0b10001'