擅长:python、mysql、java
<p><code>**</code>可用于任何映射类型。使<code>M</code>成为映射类型的一种方法是将<code>collections.abc.Mapping</code>子类化并实现<code>__getitem__</code>、<code>__iter__</code>和<code>__len__</code>:</p>
<pre><code>from collections.abc import Mapping
class M(Mapping):
def __init__(self):
self.a = 3
self.b = 5
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
yield 'a'
yield 'b'
def __len__(self):
return 2
def foo(**kwargs):
for k, v in kwargs.items():
print(k, v)
m = M()
foo(**m)
</code></pre>
<p>如果您已经有了一个<code>to_dict</code>方法,那么所有三个神奇的方法都可以是相应的<code>dict</code>方法的包装器</p>
<pre><code>class M(Mapping):
def __init__(self):
self.a = 3
self.b = 5
def to_dict(self):
return {'a': self.a, 'b': self.b}
def __getitem__(self, key):
return self.to_dict()[key]
def __iter__(self):
return iter(self.to_dict())
def __len__(self):
return len(self.to_dict())
</code></pre>