擅长:python、mysql、java
<p>我的解决方案类似于@khachik加上一些方法缓存。在</p>
<ul>
<li>请注意,使用uGetAttr_Uu很容易进入无限循环。在</li>
<li>此外,如果需要,您可能需要添加线程锁</li>
</ul>
<p><em>代码未经测试,请将其视为伪代码。</em></p>
<pre><code>class Outer(object):
def __init__(self):
self.method_cache = {}
self.methods_to_override = ['foo', 'goo']
def __getattr__(self, method_name):
if method_name in self.methods_to_override:
if method_name in self.method_cache:
return self.method_cache[method_name]
else:
def wrapper(*args, **kw):
wrapped = getattr(self.inner, method_name)
try:
return wrapped(*args, **kw)
except InnerDiedError:
self.inner = self.InnerFactory(innerType)
wrapped = getattr(self.inner, method_name)
return wrapped(*args, **kw)
self.method_cache[method_name] = wrapper
return wrapper
</code></pre>