擅长:python、mysql、java
<p>每个decorator为名称<code>f3</code>分配一个新函数<code>wrapper</code>,这意味着有3个不同的函数被调用:原始的<code>f3</code>,从<code>countt</code>返回的<code>wrapper</code>,以及从<code>memorize</code>返回的<code>wrapper</code>。在最后一行中,<code>print(f3...)</code>指的是来自<code>memorize</code>的<code>wrapper</code>。但是在<code>countt</code>中的<code>wrapper</code>中,<code>wrapper.calls += 1</code>指的是来自<code>countt</code>的<code>wrapper</code>,而不是来自<code>memorize</code>的。所以你看不到<code>wrapper.calls += 1</code>的效果,因为你看的是错误的函数对象。但是,如果您选中<code>f3.__wrapped__.calls</code>,您将看到正确的值(11)。你知道吗</p>
<p>最后的<code>f3</code>(来自<code>memorize</code>的<code>wrapper</code>)甚至有一个<code>calls</code>属性的原因是<code>memorize</code>中的<code>@wraps</code>将该属性从<code>wrapper</code>从<code>countt</code>复制到来自<code>memorize</code>的<code>wrapper</code>。你知道吗</p>