<p>当您实际需要访问包装的<code>self</code>时,这有点进退两难,因为有一条准则告诉您不要重命名任何一个<code>self</code>参数,但有一条更强大的准则告诉您不要用另一个<code>self</code>来隐藏一个<code>self</code>。你知道吗</p>
<p>在pep8中没有什么可以告诉你该做什么;文档中甚至没有一个例子。你知道吗</p>
<hr/>
<p>但这是有原因的。实际上,很少需要访问包装的<code>self</code>。看看你的代码:你不会对<code>self2</code>做任何事情:</p>
<pre><code>def tracemethod(self, f):
def wrapped(self2, *args, **kwargs) :
outstring = "{}({},{})".format(f.__name__, str(args), str(kwargs))
self.log(outstring)
return f(self2, *args, **kwargs)
return wrapped
</code></pre>
<p>显然,您确实希望在输出中跳过它,但是您可以通过切片<code>[1:]</code>来完成。因此,就像文档中的所有示例一样,将其保留在<code>*args</code>中,而不是将其作为单独的参数取出:</p>
<pre><code>def tracemethod(self, f):
def wrapped(*args, **kwargs) :
outstring = "{}({},{})".format(f.__name__, str(args[1:]), str(kwargs))
self.log(outstring)
return f(*args, **kwargs)
return wrapped
</code></pre>
<p>所以,在你的情况下,问题避免了。你知道吗</p>
<hr/>
<p>当你不能侥幸逃脱时怎么办?你知道吗</p>
<p>在这种情况下,似乎没有一个被广泛接受的标准。说真的,任何能清楚表明哪个自我是哪个自我的东西,并且能很容易地从视觉上区分两者的东西,都是可以的;<code>self2</code>并不能很好地解决这个问题,但阿马达农的<code>wrappedself</code>确实做到了。你知道吗</p>
<p>我认为我见过的两个最常见的名字是<code>inner_self</code>和<code>wrapped_self</code>(带下划线或不带下划线),但如果不做更科学的调查,我不会太依赖于这一点。你知道吗</p>
<p>我也看过一个教程(虽然我不记得在哪里),它建议在另一个函数调用中包装所有内容,只是为了避免出现问题,但这在我看来是相当愚蠢的。你知道吗</p>