Я очень удивлен, что этот вопрос вызвал недовольство. Зачем? Это показывает исследовательские усилия? Нет! Может быть, ОП провел исследование, но он не сделал это очевидным. Это полезно? Это понятно? Понятно, что у него проблемы с передачей анонимных объектов. Но почему его личная борьба за получение знаний может быть полезной?
Вы задаетесь вопросом, почему вы должны приложить столько «усилий» при наборе кода superfluos, просто чтобы сделать простой пунктирный серый эллипс.
Прежде всего вы должны иметь в виду, что с «Qt» вы используете объектно-ориентированную среду. Таким образом, в терминологии и концептуальном плане вы используете набор классов, из которых вы создаете экземпляры объектов. То, что вы называете типами, это классы.
В вашем примере вы не делаете следующее:
grid.setPen (Qt.Pen)
Что бы передать setPen TYPE Qt.Pen
, но вы определяете объект . В отличие от классов объекты содержат отдельные значения: 5 (= Qt.gray
), 0, 3 (= Qt.DotLine
). Это упрощение, но это просто для понимания.
Как и в «type
» integer
, говорится, что каждый объект этого типа (класса) может содержать целочисленные значения, но сам не содержит отдельных значений. Но он определяет, что каждый экземпляр type
(класса) integer
ДОЛЖЕН содержать значения целых чисел. Целочисленные переменные содержат экземпляры (объекты) класса с отдельными значениями.
Возвращаясь к вашему примеру, вы создаете объект класса (типа) QtPen
, который метод setPen
знает для обработки:
grid.setPen (Qt.QPen (Qt.Qt.gray, 0, Qt.Qt.DotLine))
Ваш объект просто принадлежит к классу (типу) Qt.Pen
. Таким образом, вы не просто передаете TYPE , но вы передаете три значения, которые вы явно упомянули в качестве аргументов ПЛЮС ТОННИХ других неявно полезных вещей с объектом ( например, CapStyle, MiterLimit, JoinStyle ...)
В python нет неявной проверки типов аргументов. Чтобы вы могли передать, что вы предложили:
grid.setPen («серый», 0, «пунктирный»)
НО метод ожидает некоторые объекты, с которыми он знаком, и знает, как с ними обращаться. Строка-ОБЪЕКТ, которую не знает для обработки. Так что это будет ВАША работа, чтобы объяснить, что она должна делать. Поэтому вам придется либо подкласс Qt.Pen
с конструктором, который может обрабатывать ваши строки, либо напрямую изменять класс Qt.Pen и перекомпилировать QT впоследствии.
Я допускаю, что класс Qt.Pen
не является оптимальным примером. Таким образом, мы могли бы создать лучший пример, чтобы проиллюстрировать основные концепции и то, где вы находитесь в ложных предположениях.
Но сначала я бы сказал, что ваш «суррогатный» вопрос возник из-за большой путаницы в понимании объектно-ориентированной парадигмы, но он не смог разглядеть источник вашего замешательства в отсутствии большей проницательности - это проблема курица / яйцо .
Есть много дорог в Риме, которые вы выбираете сами. Но с решением использовать «Qt» вы уже определились с общим набором дорог. И они построены для объектов .
Предположим, мы хотим нарисовать несколько домов. Итак, мы определяем метод draw_house
, используя magical_drawing_routine
(что, кстати, именно то, что вы искали в исходном вопросе):
def draw_house(house):
magical_drawing_routine(house)
draw_house('parentshome')
draw_house('myhome')
Теперь у нас есть ровно два одинаковых нарисованных дома без дверей, окон или прекрасной трубы дома наших родителей. (И мы полностью игнорируем, как magical_drawin_routine
знает, как интерпретировать строковые значения)
Возвращаясь к чертежной доске, мы исправим их отсутствие:
def draw_house(door, window, chimney):
magical_drawing_routine(door, window, chimney)
parentshome = ['oak', 'green', 'yes']
myhome = ['beech', 'red', 'no']
draw_house(parentshome)
draw_house(myhome)
Теперь у нас есть ровно два одинаковых нарисованных дома с дверями, окнами и прекрасным камином дома наших родителей. Но подождите, окна и двери имеют точно такую же форму. Вернуться к чертежной доске ...
после нескольких циклов у вас будет что-то вроде:
def draw_house(doormaterial, doorcolor, doorshape, doorwithglass, doorglassparts, windowsnumber, widnowsdistributionpattern, windowsencassing, windowmaterial, windowshape, windowpattern, windowdecoration, chimney):
...
или мы можем определить классы: class House, class Window, class Door, class Chimney
с приемлемыми значениями по умолчанию.
pdoor, mdoor = Door(a,b), Door(a,Z)
pwin, mwin = Window(e,f,g), Window(e,f,Y)
pchimney, mchimney = Chimney(h), Chimney(X)
parentshome = House(pdoor, pwin, pchimney)
myhome = House(mdoor, mwin, mchimney)
если вы используете дверь для своего родителя только один раз, вы можете отказаться от определения pdoor и создать экземпляр объекта на лету, передавая аргументы, путем гееренирования анонимного объекта (без прикрепленной переменной): parenthome = House (Дверь (...), ...)
Итак, простой ответ: вы не передаете типы ! Вы передаете объекты , которые обычно инкапсулируют сложности .Но для ужасных простых объектов это может выглядеть как ваши слишком сложные вещи - но это просто так.