我想编写一个行为类似于 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/