擅长:python、mysql、java
<p>您的decorator正在更新错误的<code>__dict__</code>;<code>self</code>在您的decorator中<code>__call__</code>是<em>decorator对象本身</em>。你知道吗</p>
<p>您需要从被调用的包装器中提取绑定的<code>self</code>参数:</p>
<pre><code>def wrapped_f(*args, **kwargs):
for a in kwargs:
if not a in self.validkeys:
raise Exception()
instance = args[0]
instance.__dict__.update(kwargs)
return f(*args, **kwargs)
</code></pre>
<p>你也可以给你的<code>wrapped_f()</code>一个明确的第一个参数:</p>
<pre><code>def wrapped_f(instance, *args, **kwargs):
for a in kwargs:
if not a in self.validkeys:
raise Exception()
instance.__dict__.update(kwargs)
return f(instance, *args, **kwargs)
</code></pre>
<p>这里<code>instance</code>绑定到<code>Node3D</code>实例。请注意,命名这个变量<code>self</code>并没有硬性要求;这只是一个约定。你知道吗</p>