Флаги Python в конструкторе объектов - PullRequest
0 голосов
/ 15 октября 2018

В некоторых случаях я сталкивался с концепцией флагов в python, например, в wxPython.Примером является инициализация объекта кадра.Атрибуты, которые передаются в «style».

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

Я не совсем понимаю концепцию флагов.Я даже не нашел убедительного объяснения, что именно означает «флаг» в Python.Как все эти атрибуты передаются одной переменной?Единственное, о чем я могу думать, это то, что "|"символ используется в качестве логического оператора, но в этом случае не все ли атрибуты, переданные стилю, просто будут оцениваться как одно логическое выражение?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Это логический оператор - не логический, а побитовый.wx.MAXIMIZE_BOX, а остальные, как правило, являются целыми числами, имеющими степень двойки - 1, 2, 4, 8, 16 ..., что делает их так, что только один бит в них равен 1, все остальные равны 0. Когда выпримените побитовое ИЛИ (x | y) к таким целым числам, конечный эффект состоит в том, что они объединяются: 2 | 8 (0b00000010 | 0b00001000) становится 10 (0b00001010).Позже их можно отобрать, используя побитовый оператор AND (x & y), также вызывая оператор маскирования: 10 & 8 > 0 будет истинным, поскольку бит, соответствующий 8, включен.

0 голосов
/ 15 октября 2018

Флаги не являются уникальными для Python;это понятие используется во многих языках.Они основаны на понятиях битов и байтов , где компьютерная память хранит информацию, используя, по существу, огромное количество флагов .Этими флагами являются биты , они либо выключены (значение 0), либо включены (значение 1), даже если вы обычно обращаетесь к памяти компьютера группами не менее 8таких флагов ( байтов , а для больших групп слов , кратных 8, характерных для архитектуры компьютера).

Целые числа - простое и распространенное представление информации, хранящейся в байтах ;один байт может хранить любое целое число от 0 до 255, а с большим количеством байтов вы можете представлять большие целые числа.Но эти целые числа все еще состоят из битов, которые либо включены, либо выключены, и поэтому вы можете использовать их как переключатели для включения или отключения функций.Вы передаете определенные целочисленные значения с включенными или отключенными определенными битами для включения и выключения функций.

Таким образом, байт состоит из 8 флагов (битов), и включение одного из них означает, что у вас есть 8 различных целых чисел;1, 2, 4, 8, 16, 32, 64 и 128, и вы можете передать комбинацию этих чисел в библиотеку, например, wxPython, чтобы установить различные параметры.Для многобайтовых целых чисел числа просто увеличиваются в два раза.

Но вы а) не хотите вспоминать, что означает каждое число, и б) нужен метод объединения их в одно целое число, чтобыпередать.

Оператор | выполняет последнее, а имена wx.MAXIMIZE_BOX, wx.RESIZE_BORDER и т. д. являются просто символическими константами для целочисленных значений, установленных проектом wxWidgetв различных заголовочных файлах C и суммированы в wx/toplevel.h и wx/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

...
*/

The *Оператор 1048 * является побитовым оператором ИЛИ ;он объединяет биты двух целых чисел, каждый совпадающий бит спаривается и превращается в выходной бит в соответствии с логическими правилами для ИЛИ.Когда вы делаете это для этих целочисленных констант, вы получаете новое целое число с включенными несколькими флагами.

Таким образом, выражение

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

дает вам целое число с номерами битов 9, 611, 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

На принимающей стороне выможно использовать оператор & побитового И для проверки, установлен ли определенный флаг;это возвращает 0, если флаг не установлен, или то же самое целое число, которое назначено константе флага, если бит флага был установлен.И в C, и в Python ненулевое число равно true в логическом тесте, поэтому тестирование для определенного флага обычно выполняется с помощью:

if ( style & wxMAXIMIZE_BOX ) {

для определения того, что конкретныйустановлен флаг или

if ( !(style & wxBORDER_NONE) )

для проверки на обратное.

0 голосов
/ 15 октября 2018

Что обычно подразумевается под флагами в этом смысле, это биты в одном целочисленном значении.| - это обычный битовый или оператор.

Скажем, wx.MAXIMIZE_BOX=8 и wx.RESIZE_BORDER=4, если вы или они вместе, вы получите 12. В этом случае вы можете использовать оператор + вместо |.

Попробуйте напечатать константы print(wx.MAXIMIZE_BOX) и т. Д., И вы сможете лучше понять.

...