我应该使用类还是字典?
我有一个类,这个类里面只有一些字段,没有任何方法,像这样:
class Request(object):
def __init__(self, environ):
self.environ = environ
self.request_method = environ.get('REQUEST_METHOD', None)
self.url_scheme = environ.get('wsgi.url_scheme', None)
self.request_uri = wsgiref.util.request_uri(environ)
self.path = environ.get('PATH_INFO', None)
# ...
这个类其实可以很容易地转换成一个字典。使用类的话,未来如果需要添加东西会更灵活,而且如果用上__slots__
,性能也可能会更好。那么,使用字典有什么好处呢?字典会比这个类快吗?还有,比起使用了slots
的类,字典会更快吗?
11 个回答
45
在Python中,类其实底层是一个字典。使用类会有一些额外的开销,但如果没有专门的工具,你是不会感觉到这些差别的。在这种情况下,我认为使用类有以下好处:
- 所有的逻辑都集中在一个地方,方便管理
- 更新起来很简单,而且内容是封闭的,不容易被外部干扰
- 如果以后需要修改什么,你可以轻松保持接口不变
50
除非你需要类的额外功能,否则可以使用字典。你也可以用namedtuple
来做一个折中的选择:
>>> from collections import namedtuple
>>> request = namedtuple("Request", "environ request_method url_scheme")
>>> request
<class '__main__.Request'>
>>> request.environ = "foo"
>>> request.environ
'foo'
在这里,性能差异会很小,不过我会很惊讶如果字典的速度不更快。
39
你为什么要把这个做成字典呢?这样有什么好处?如果你以后想加一些代码,那你的 __init__
代码应该放在哪里呢?
类是用来把相关的数据(通常还有代码)放在一起的。
字典是用来存储键值对的,通常键都是同一种类型,值也是同一种类型。有时候,当你不知道所有的键或属性名称时,字典可以用来打包数据,但这往往说明你的设计可能有问题。
还是保持它为一个类吧。