一个像dict一样的python类

我想写一个类似dict的自定义类 – 所以,我从dictinheritance。

我的问题是,我是否需要在__init__()方法中创build一个私人dict成员? 我没有看到这一点,因为我已经有dict行为,如果我只是从dictinheritance。

任何人都可以指出为什么大部分的inheritance片段看起来像下面的那个?

 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 

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

但是,怎么样的数组访问运算符[] ? 如何实现呢? 到目前为止,我还没有看到一个例子显示如何重写[]运算符。

所以如果自定义类中没有提供[]访问函数,那么inheritance的基类方法将在不同的字典上运行?

我尝试了下面的代码来testing我对Pythoninheritance的理解:

 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:<内build函数ID>

上面的代码有什么问题?

如何纠正类myDict以便我可以这样写代码?

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

[编辑]

我已经编辑了上面的代码示例,摆脱我在离开办公桌之前所做的愚蠢的错误。 这是一个错字(我应该从错误信息中发现它)。

检查模拟容器types的文档。 在你的情况下,第一个add参数应该是self

 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} 

喜欢这个

 class CustomDictOne(dict): def __init__(self,*arg,**kw): super(CustomDictOne, self).__init__(*arg, **kw) 

现在,您可以使用内置函数,如dict.get()作为self.get()

你不需要隐藏一个隐藏的self._dict 。 你的课已经字典了。

为了完整起见,下面是@björn-pollex提到的最新Python 2.x文档的链接(截止到编写时的2.7.7):

模拟容器types

(对不起,不使用评论function,我只是不允许这样做通过计算器。)

这个代码块的问题:

 class myDict(dict): def __init__(self): self._dict = {} def add(id, val): self._dict[id] = val md = myDict() md.add('id', 123) 

…是你的'add'方法(…和任何你想成为类的成员的方法)需要有一个明确的“self”声明为它的第一个参数,如:

 def add(self, 'id', 23): 

要通过键实现操作符重载以访问项目,请查看魔术方法__getitem____setitem__的文档 。

请注意,因为Python使用了Duck Typing,实际上可能没有任何理由从语言的dict类派生自定义的dict类,而无需更多地了解您要做什么(例如,如果您需要传递此实例类到一些代码将会打破,除非isinstance(MyDict(), dict) == True ),你可能会更好的只是实现API,使你的类足够像字典,并在那里停止。