Ответ 1
Это больше вопрос Python.
Python очень динамичный язык. Вы можете кодировать вещи (классы) заблаговременно, или Python позволяет вам создавать классы полностью динамически во время выполнения. Рассмотрим следующий пример простого векторного класса. Вы можете заранее создать/кодировать класс, например:
class MyVector(object):
x = 0
y = 0
или вы можете создать класс динамически, выполнив:
fields = {'x':0, 'y':0}
MyVector = type('MyVector', (object,), fields)
Основное различие между методами состоит в том, что для одного вы заранее знаете атрибуты класса, тогда как для второго метода, как вы можете себе представить, вы можете программно создать словарь fields
, поэтому вы можете создать полностью динамический класс ( эс).
Поэтому, когда вы заранее знаете атрибуты класса, вы можете установить атрибуты класса, используя обозначение объекта:
instance.attribute = value
Имейте в виду, что это эквивалентно:
instance.__setattr__("attribute", value)
Однако существуют сценарии, в которых вы не знаете атрибутов класса, которыми вам нужно будет управлять заранее. Здесь вы можете использовать функцию __setattr__
. Однако это не рекомендуемая практика. Поэтому вместо этого рекомендуется использовать встроенный метод Python setattr
, который внутренне вызывает метод __setattr__
:
setattr(instance, attribute, value)
Используя этот подход, вы можете устанавливать атрибуты, которые вы не знаете заранее, или вы можете даже зацикливать некоторые dict
и устанавливать значения из dict:
values = {
'title': 'This is edit title',
...
}
for k, v in values.items():
setattr(ticket, k, v)
Не знаю, почему обычная запись не работает. Вероятно, это не имеет ничего общего с методом, который вы использовали для установки атрибутов.