我看到我的一位同事写了他的代码,如:
class a(dict):
# something
pass
这是一项常用技巧吗?它的用途是什么?
答案 0 :(得分:1)
当你想要一个具有字典默认行为(获取和设置键)的类时,可以这样做,但实例将用于特定情况,并且你预计需要提供自定义方法或构造函数具体到那些。
例如,您可能希望有一个动态KeyStorage
作为内存存储启动,但稍后会调整该类以将数据保存在磁盘上。
您还可以根据需要修改密钥和值 - 例如,在具有特定编码的数据库上存储unicode数据。
答案 1 :(得分:1)
在某些情况下,这是有道理的。例如,您可以创建一个允许不区分大小写查找的字典:
class case_insensitive_dict(dict):
def __getitem__(self, key):
return super(case_insensitive_dict, self).__getitem__(key.lower())
def __setitem__(self, key, value):
return super(case_insensitive_dict, self).__setitem__(key.lower(), value)
d = case_insensitive_dict()
d["AbCd"] = 1
print d["abcd"]
(这可能需要额外的错误处理)
答案 2 :(得分:1)
扩展内置的dict类对于创建dict" supersets" (例如"束"类可以在javascript中访问对象样式的键),而无需手动重新实现MutableMapping
的5种方法。
但如果你的同事真的写了
class MyDict(dict):
pass
没有任何自定义,我只能看到它的邪恶用途,例如向dict添加属性:
>>> a = {}
>>> a.foo = 3
AttributeError: 'dict' object has no attribute 'foo'
>>> b = MyDict()
>>> b.foo = 3
>>>