擅长:python、mysql、java
<p>与其动态创建这么多方法,不如重写类的<code>__getattr__</code>方法并从中返回一个可调用的:</p>
<pre><code>class Example(dict):
def __getattr__(self, k):
if k in self:
return lambda: self[k]
raise TypeError('Example object has not attribute {!r}'.format(k))
</code></pre>
<p>请注意,对于<code>keys()</code>、<code>items()</code>等键,<code>__getattr__</code>不会被调用,因为它们是由<code>__getattribute__</code>本身在类中找到的。最好不要用它们来命名你的钥匙。你知道吗</p>
<p>演示:</strong></p>
<pre><code>>>> d = Example(a=1, b=2, c=3)
>>> d.a()
1
>>> d.b()
2
>>> d.foo()
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
d.foo()
File "/home/ashwini/py/so.py", line 7, in __getattr__
raise TypeError('Example object has not attribute {!r}'.format(k))
TypeError: Example object has not attribute 'foo'
</code></pre>