使用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
)与以下方法相比如何:
不使用广告位,不是继承自dict
属性访问会更慢(无法在命令行测试中验证这一点)吗?
将'__dict__'
添加到__slots__
,而不是从dict
继承。
This answer on slots表明它可以为我们提供我们想要的行为。
还有其他一些原因可以让人们想要使用__slots__
并继承dict
吗?