对象构造函数中的Python标志

时间:2018-10-15 11:35:17

标签: python flags

在某些场合,例如在wxPython中,我遇到了标志的概念。一个示例是帧对象的初始化。 传递给“样式”的属性。

frame = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX)

我不太了解标志的概念。我什至还没有找到扎实的解释来解释术语“标志”在Python中的确切含义。所有这些属性如何传递给一个变量? 我唯一能想到的就是“ |”字符用作布尔运算符,但是在那种情况下,传递给style的所有属性不是仅求值一个布尔表达式吗?

3 个答案:

答案 0 :(得分:0)

在这种意义上,标志通常意味着单个整数值中的位。 |是常用的位或运算符。

比方说wx.MAXIMIZE_BOX=8wx.RESIZE_BORDER=4,如果您或他们在一起,则得到12。在这种情况下,您实际上可以使用+运算符代替|

尝试打印常量print(wx.MAXIMIZE_BOX)等,您可能会更好地理解。

答案 1 :(得分:0)

它是一个布尔运算符-不是逻辑运算符,而是按位运算符。 wx.MAXIMIZE_BOX和其余的通常是整数,它们是2-1、2、4、8、16的幂...这样就使得它们中只有一位为1,其余的均为0。当对这些整数应用按位或(x | y)时,最终结果是它们结合在一起:2 | 80b00000010 | 0b00001000)变为10(0b00001010)。以后可以使用按位AND(x & y)运算符将它们撬开,也可以调用屏蔽运算符:10 & 8 > 0将为true,因为与8对应的位已打开。

答案 2 :(得分:0)

标记不是Python特有的;这是许多语言中使用的概念。它们基于位和字节的概念,计算机内存实际上使用大量的 flags 存储信息。这些标志是bits,它们是关闭的(值0)或打开的(值1),即使您通常以至少8个这样的标志的组访问计算机内存( bytes,对于较大的组,words为8的倍数,具体取决于计算机体系结构。

整数是一个简单而通用的representation of the information stored in bytes;一个字节可以存储0到255之间的任何整数,而更多字节则可以表示更大的整数。但是这些整数仍然由打开或关闭的位组成,因此您可以将其用作开关来启用或禁用功能。您传入启用或禁用了特定位的特定整数值来打开和关闭功能。

因此,一个字节由8个标志(位)组成,启用这些标志之一意味着您具有8个不同的整数; 1、2、4、8、16、32、64和128,您可以将这些数字的组合传递给wxPython之类的库来设置不同的选项。对于多字节整数,数字只会增加一倍。

但是您a)不想记住每个数字的含义,并且b)需要一种将它们组合成单个整数以继续进行下去的方法。

|运算符执行后者,而wx.MAXIMIZE_BOXwx.RESIZE_BORDER等名称只是由wxWidget设置的整数值的符号常量。项目放在各种C头文件中,并总结在wx/toplevel.hwx/defs.h中:

/*
    Summary of the bits used (some of them are defined in wx/frame.h and
    wx/dialog.h and not here):
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  \_ wxCENTRE
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  \____ wxFRAME_NO_TASKBAR
      |  |  |  |  |  |  |  |  |  |  |  |  |  \_______ wxFRAME_TOOL_WINDOW
      |  |  |  |  |  |  |  |  |  |  |  |  \__________ wxFRAME_FLOAT_ON_PARENT
      |  |  |  |  |  |  |  |  |  |  |  \_____________ wxFRAME_SHAPED
      |  |  |  |  |  |  |  |  |  |  \________________ wxDIALOG_NO_PARENT
      |  |  |  |  |  |  |  |  |  \___________________ wxRESIZE_BORDER
      |  |  |  |  |  |  |  |  \______________________ wxTINY_CAPTION_VERT
      |  |  |  |  |  |  |  \_________________________
      |  |  |  |  |  |  \____________________________ wxMAXIMIZE_BOX
      |  |  |  |  |  \_______________________________ wxMINIMIZE_BOX
      |  |  |  |  \__________________________________ wxSYSTEM_MENU
      |  |  |  \_____________________________________ wxCLOSE_BOX
      |  |  \________________________________________ wxMAXIMIZE
      |  \___________________________________________ wxMINIMIZE
      \______________________________________________ wxSTAY_ON_TOP

...
*/

/*
    Summary of the bits used by various styles.
    High word, containing styles which can be used with many windows:
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  \_ wxFULL_REPAINT_ON_RESIZE
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  \____ wxPOPUP_WINDOW
      |  |  |  |  |  |  |  |  |  |  |  |  |  \_______ wxWANTS_CHARS
      |  |  |  |  |  |  |  |  |  |  |  |  \__________ wxTAB_TRAVERSAL
      |  |  |  |  |  |  |  |  |  |  |  \_____________ wxTRANSPARENT_WINDOW
      |  |  |  |  |  |  |  |  |  |  \________________ wxBORDER_NONE
      |  |  |  |  |  |  |  |  |  \___________________ wxCLIP_CHILDREN
      |  |  |  |  |  |  |  |  \______________________ wxALWAYS_SHOW_SB
      |  |  |  |  |  |  |  \_________________________ wxBORDER_STATIC
      |  |  |  |  |  |  \____________________________ wxBORDER_SIMPLE
      |  |  |  |  |  \_______________________________ wxBORDER_RAISED
      |  |  |  |  \__________________________________ wxBORDER_SUNKEN
      |  |  |  \_____________________________________ wxBORDER_{DOUBLE,THEME}
      |  |  \________________________________________ wxCAPTION/wxCLIP_SIBLINGS
      |  \___________________________________________ wxHSCROLL
      \______________________________________________ wxVSCROLL

...
*/

|运算符是bitwise OR operator;它结合了两个整数的位,每个匹配位都根据OR的布尔规则配对,并变成一个输出位。当对这些整数常量执行此操作时,您将获得一个启用了多个标志的新整数。

所以表达式

wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX

为您提供一个整数,并设置位数9、6、11、29和12;在这里,我用'0''1'字符串表示位,用int(..., 2)将这些字符串的序列解释为二进制表示的单个整数:

>>> fourbytes = ['0'] * 32
>>> fourbytes[9] = '1'
>>> fourbytes[6] = '1'
>>> fourbytes[11] = '1'
>>> fourbytes[29] = '1'
>>> fourbytes[12] = '1'
>>> ''.join(fourbytes)
'00000010010110000000000000000100'
>>> int(''.join(fourbytes), 2)
39321604

在接收端,可以使用&按位AND运算符来测试是否设置了特定标志;如果未设置标志,则返回0;如果已设置标志位,则返回与分配给标志常量的整数。在C语言和Python语言中,布尔测试中的 true 均为非零值,因此通常使用以下方法来测试特定标志:

if ( style & wxMAXIMIZE_BOX ) {

用于确定已设置特定标志,或者

if ( !(style & wxBORDER_NONE) )

测试相反的情况。