<p>您需要的是对象代理。这是一些非常复杂的东西,因为您正在进入python的数据模型,并以有趣的方式操作一些非常基本的dunder(双下划线)方法</p>
<pre class="lang-py prettyprint-override"><code>class Proxy:
def __init__(self, proxied):
object.__setattr__(self, '_proxied', proxied)
def __getattribute__(self, name):
try:
return object.__getattribute__(self, name)
except AttributeError:
p = object.__getattribute__(self, '_proxied')
return getattr(p, name)
def __setattr__(self, name, value):
p = object.__getattribute__(self, '_proxied')
if hasattr(p, name):
setattr(p, name, value)
else:
setattr(self, name, value)
def __getitem__(self, key):
p = object.__getattribute__(self, '_proxied')
return p[key]
def __setitem__(self, key, value):
p = object.__getattribute__(self, '_proxied')
p[key] = value
def __delitem__(self, key):
p = object.__getattribute__(self, '_proxied')
del p[key]
</code></pre>
<p>这里发生的最明显的事情是,在内部,这个类必须使用dunders的<code>object</code>实现来避免无限递归。这样做的目的是保存对代理对象的引用,然后如果您尝试获取或设置属性,它将检查代理对象,如果代理对象具有该属性,它将使用该属性,否则它将在自身上设置该属性。对于索引,就像列表一样,它直接作用于代理对象,因为代理本身不允许索引</p>
<p>如果您需要在生产中使用它,那么您可能应该查看一个名为<a href="https://wrapt.readthedocs.io/en/latest/wrappers.html" rel="nofollow noreferrer">wrapt</a>的包</p>