创建带有预定义键的字典
在Python中,有没有办法创建一个类,让它像字典一样使用,但在创建新实例时,键(也就是字典里的项)是预先定义好的?
5 个回答
3
没错,在Python中,dict
是一个类,所以你可以从它派生出自己的类:
class SubDict(dict):
def __init__(self):
dict.__init__(self)
self.update({
'foo': 'bar',
'baz': 'spam',})
在这里,你重写了dict
的__init__()
方法(这个方法是在创建类的实例时会被调用的)。在__init__
里面,你首先调用了父类的__init__()
方法,这是一种常见的做法,当你想要扩展父类的功能时就会这么做。然后,你用你的初始数据来更新新创建的SubDictionary
实例。
subDict = SubDict()
print subDict # prints {'foo': 'bar', 'baz': 'spam'}
12
你还可以让这个字典的子类限制只能使用预先定义好的键,也就是通过重写 __setitem__()
这个方法来实现。
>>> class LimitedDict(dict):
_keys = "a b c".split()
def __init__(self, valtype=int):
for key in LimitedDict._keys:
self[key] = valtype()
def __setitem__(self, key, val):
if key not in LimitedDict._keys:
raise KeyError
dict.__setitem__(self, key, val)
>>> limited = LimitedDict()
>>> limited['a']
0
>>> limited['a'] = 3
>>> limited['a']
3
>>> limited['z'] = 0
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
limited['z'] = 0
File "<pyshell#56>", line 8, in __setitem__
raise KeyError
KeyError
>>> len(limited)
3
10
你可以很简单地扩展任何内置类型。下面是如何对字典(dict)进行扩展的示例:
>>> class MyClass(dict):
... def __init__(self, *args, **kwargs):
... self['mykey'] = 'myvalue'
... self['mykey2'] = 'myvalue2'
...
>>> x = MyClass()
>>> x['mykey']
'myvalue'
>>> x
{'mykey2': 'myvalue2', 'mykey': 'myvalue'}
我没能找到关于这个的Python官方文档,不过一本非常受欢迎的书《Dive Into Python》(可以在网上免费获取)里面有一些关于如何做到这一点的例子,具体可以查看这里。