一个像dict一样的python类
我想写一个类似dict
的自定义类 – 所以,我从dict
inheritance。
我的问题是,我是否需要在__init__()
方法中创build一个私人dict
成员? 我没有看到这一点,因为我已经有dict
行为,如果我只是从dict
inheritance。
任何人都可以指出为什么大部分的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,使你的类足够像字典,并在那里停止。