创建带有预定义键的字典

4 投票
5 回答
9838 浏览
提问于 2025-04-15 11:23

在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》(可以在网上免费获取)里面有一些关于如何做到这一点的例子,具体可以查看这里

撰写回答