使用`__slots__`的动机是什么?

时间:2018-05-04 14:59:25

标签: python slots

使用Sanic(Python中的异步Web框架),我试图将自定义数据添加到请求中:

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继承已通过a pull request添加,以允许将数据附加到Request对象。

所以推荐的方法是:

request['user'] = 'A nice user'

这一切都很好,我理解它是如何工作的。

然而,我对此类__slots__的使用感到困惑,因为它继承自dict

允许将数据附加到此类的另一种方法'实例本来就是完全删除__slots__(那时我们可以完成request.user = ...)。

我理解事物的方式,__slots__的一个用途是减少对象的内存占用,从而阻止创建__dict__属性。

但是,如果我们继承字典,这仍然有意义吗?

使用sys.getsizeof进行一些命令行测试表明它没有,但我不确定我是否可以相信这些。

这种允许在实例上添加数据的方法(使用插槽,继承自dict)与以下方法相比如何:

  1. 不使用广告位,不是继承自dict 属性访问会更慢(无法在命令行测试中验证这一点)吗?

  2. '__dict__'添加到__slots__,而不是从dict继承。
    This answer on slots表明它可以为我们提供我们想要的行为。

  3. 还有其他一些原因可以让人们想要使用__slots__并继承dict吗?

0 个答案:

没有答案