Работая с Sanic (асинхронный веб-фреймворк на Python), я пытался добавить пользовательские данные в запрос:
request.user = 'A nice user'
Но я не смог, request
имеет тип Request
и не позволяет этого.
Просмотр исходного кода для класса Request
:
class Request(dict):
"""Properties of an HTTP request such as URL, headers, etc."""
__slots__ = (
'app', 'headers', 'version', 'method', '_cookies', 'transport',
'body', 'parsed_json', 'parsed_args', 'parsed_form', 'parsed_files',
'_ip', '_parsed_url', 'uri_template', 'stream', '_remote_addr',
'_socket', '_port', '__weakref__'
)
При поиске в Интернете это наследование dict
было добавлено через запрос на извлечение , чтобы разрешить присоединение данных к объекту Request
.
Итак, рекомендуемый подход:
request['user'] = 'A nice user'
Это все нормально, я понимаю, как это работает.
Однако, Меня смущает использование __slots__
в этом классе, поскольку он наследуется от dict
.
Другим способом разрешить присоединение данных к экземплярам этого класса было бы удаление всего __slots__
(тогда мы могли бы сделать request.user = ...
).
Как я понимаю, одно из применений __slots__
- уменьшить объем памяти объекта, предотвращая создание атрибута __dict__
.
Но если мы наследуем от словаря, имеет ли это смысл?
Выполнение некоторых тестов командной строки с sys.getsizeof
предполагает, что это не так, но я не уверен, что могу доверять им.
Как этот подход позволяет добавлять данные в экземпляры (используя слоты, наследуемые от dict
) по сравнению с:
Не использует слоты, не наследует от dict
.
Будет ли доступ к атрибуту медленнее (не удалось проверить это в тестах командной строки)?
Добавление '__dict__'
к __slots__
, без наследования от dict
.
Этот ответ о слотах предполагает, что он даст нам поведение, которое мы хотим.
Существуют ли другие причины, по которым можно использовать __slots__
и наследовать от dict
здесь?