Каковы мотивы для этого использования `__slots__`? - PullRequest
0 голосов
/ 04 мая 2018

Работая с 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) по сравнению с:

  1. Не использует слоты, не наследует от dict.
    Будет ли доступ к атрибуту медленнее (не удалось проверить это в тестах командной строки)?

  2. Добавление '__dict__' к __slots__, без наследования от dict.
    Этот ответ о слотах предполагает, что он даст нам поведение, которое мы хотим.

Существуют ли другие причины, по которым можно использовать __slots__ и наследовать от dict здесь?

...