我在python中实现了一个类,它目前继承自dict,但实际上,我不希望它.继承的主要原因是我可以使用**kwargs构造将内容复制到参数列表中.
我认为python在字典上做了某种迭代,但我找不到任何文档.
这是可能的,如果是的话,怎么样?
代码示例只是为了让事情更清晰:
class MyThing():
def __init__(self):
self.dictionary = {}
thing = MyThing()
# code that causes thing.dictionary to be populated
somefunc(**thing)
Run Code Online (Sandbox Code Playgroud)
结果如下:
TypeError: somefunc() argument after ** must be a mapping, not instance
Run Code Online (Sandbox Code Playgroud)
我去阅读python源码,似乎使用了keys()和__getitem__方法
class A:
def __init__(self, data):
self.data = data
def keys(self):
return self.data.keys()
def __getitem__(self, key):
return self.data[key]
def f(alpha):
print alpha
f(**A({'alpha': 2}))
Run Code Online (Sandbox Code Playgroud)
对于好奇的,如果你在非dict上使用**,CPython会创建一个新的空字典,然后调用dict.update()将对象的键复制到dict中.
它可能最好将其作为子类来实现 collections.Mapping
class A(Mapping):
def __init__(self, data):
self.data = data
def __iter__(self):
return iter(self.data)
def __len__(self):
return len(self.data)
def __getitem__(self, key):
return self.data[key]
Run Code Online (Sandbox Code Playgroud)
由于Mapping的继承,几乎所有dict方法都受支持.鉴于错误消息,我认为您可以认为这应该符合python的所有实现.
我试过PyPy,它接受了第一个版本.