python - 一个类似于 dict 的 python 类

标签 python dictionary

我想编写一个行为类似于 dict 的自定义类 - 所以,我继承自 dict

不过,我的问题是:我是否需要在我的 __init__() 方法中创建一个私有(private)的 dict 成员?我不明白这一点,因为如果我只是从 dict 继承,我已经有了 dict 行为。

谁能指出为什么大多数继承片段看起来像下面的那个?

class CustomDictOne(dict):
   def __init__(self):
      self._mydict = {} 

   # other methods follow

而不是更简单的......

class CustomDictTwo(dict):
   def __init__(self):
      # initialize my other stuff here ...

   # other methods follow

实际上,我想我怀疑这个问题的答案是让用户无法直接访问您的字典(即他们必须使用您提供的访问方法)。

但是,数组访问运算符 [] 呢?一个人将如何实现呢?到目前为止,我还没有看到显示如何覆盖 [] 运算符的示例。

那么如果自定义类中没有提供[]访问函数,继承的基方法会在不同的字典上操作?

我尝试了以下代码片段来测试我对 Python 继承的理解:

class myDict(dict):
    def __init__(self):
        self._dict = {}

    def add(self, id, val):
        self._dict[id] = val


md = myDict()
md.add('id', 123)
print md[id]

我收到以下错误:

KeyError: < built-in function id>

上面的代码有什么问题?

如何更正类 myDict 以便我可以编写这样的代码?

md = myDict()
md['id'] = 123

[编辑]

我已经编辑了上面的代码示例,以消除我在离开办公 table 之前犯的愚蠢错误。这是一个错字(我应该从错误消息中发现它)。

最佳答案

class Mapping(dict):

    def __setitem__(self, key, item):
        self.__dict__[key] = item

    def __getitem__(self, key):
        return self.__dict__[key]

    def __repr__(self):
        return repr(self.__dict__)

    def __len__(self):
        return len(self.__dict__)

    def __delitem__(self, key):
        del self.__dict__[key]

    def clear(self):
        return self.__dict__.clear()

    def copy(self):
        return self.__dict__.copy()

    def has_key(self, k):
        return k in self.__dict__

    def update(self, *args, **kwargs):
        return self.__dict__.update(*args, **kwargs)

    def keys(self):
        return self.__dict__.keys()

    def values(self):
        return self.__dict__.values()

    def items(self):
        return self.__dict__.items()

    def pop(self, *args):
        return self.__dict__.pop(*args)

    def __cmp__(self, dict_):
        return self.__cmp__(self.__dict__, dict_)

    def __contains__(self, item):
        return item in self.__dict__

    def __iter__(self):
        return iter(self.__dict__)

    def __unicode__(self):
        return unicode(repr(self.__dict__))


o = Mapping()
o.foo = "bar"
o['lumberjack'] = 'foo'
o.update({'a': 'b'}, c=44)
print 'lumberjack' in o
print o

In [187]: run mapping.py
True
{'a': 'b', 'lumberjack': 'foo', 'foo': 'bar', 'c': 44}

关于python - 一个类似于 dict 的 python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014621/

相关文章:

java - 在 Android 应用程序中随机生成有意义(有效)的英文单词

python-3.x - 对字典值求和,使用两个键作为索引 : how to achieve this?

python - 使用列表和字典比较两个 CSV 文件

python - Python中_、frame和frame的区别

python - pygame事件在几秒钟的延迟后响应

java - 提交到 SQS 时有关将消息自动编码为 base64 的规则

arrays - "hasPrefix"在 Swift 中不工作

python - 从 CSV 文件读取时对数组的数值运算

Python创建列表列表,其中第一项的长度为1,第二项的长度为n?

c++ - 减去映射迭代器