我怎样才能使"完美"成为dict的子类?最终目标是有一个简单的字典,其中键是小写的.
似乎应该有一些微小的原语我可以覆盖以使这项工作,但根据我的所有研究和尝试似乎情况并非如此:
如果我覆盖__getitem__/__setitem__,则get/ set不起作用.我怎样才能让他们工作?当然我不需要单独实施它们?
我是否阻止酸洗工作,我是否需要实施__setstate__等?
我应该只使用mutablemapping(似乎不应该使用UserDict
或DictMixin)?如果是这样,怎么样?文档并不完全具有启发性.
这是我的第一次尝试,get()不起作用,毫无疑问还有许多其他小问题:
class arbitrary_dict(dict):
"""A dictionary that applies an arbitrary key-altering function
before accessing the keys."""
def __keytransform__(self, key):
return key
# Overridden methods. List from
# https://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict
def __init__(self, *args, **kwargs):
self.update(*args, **kwargs)
# Note: I'm using dict directly, since super(dict, self) doesn't work. …Run Code Online (Sandbox Code Playgroud) 使用UserDict类有什么好处?
我的意思是,如果不是,我真的得到了什么
class MyClass(object):
def __init__(self):
self.a = 0
self.b = 0
...
m = MyClass()
m.a = 5
m.b = 7
Run Code Online (Sandbox Code Playgroud)
我会写以下内容:
class MyClass(UserDict):
def __init__(self):
UserDict.__init__(self)
self["a"] = 0
self["b"] = 0
...
m = MyClass()
m["a"] = 5
m["b"] = 7
Run Code Online (Sandbox Code Playgroud)
编辑:如果我理解正确,我可以在两种情况下都在运行时向对象添加新字段?
m.c = "Cool"
Run Code Online (Sandbox Code Playgroud)
和
m["c"] = "Cool"
Run Code Online (Sandbox Code Playgroud) 我已经分类dict并且需要检测它的所有修改.
(我知道我无法检测到存储值的就地修改.没关系.)
我的代码:
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.modified = True
def __delitem__(self, key):
super().__delitem__(key)
self.modified = True
Run Code Online (Sandbox Code Playgroud)
问题是它只适用于简单的分配或删除.它未检测到所做的更改pop(),popitem(),clear()和update().
为什么__setitem__和__delitem__当项目被添加或删除绕过?我是否还必须重新定义所有这些方法(pop等等)?
为什么python不提供UserSet扩展和定义用户定义Set的类。它确实提供了UserDict,UserList,UserString但没有UserSet。
我指的是Python文档