<p>使用已有的<code>self</code>变量就简单多了。完全没有理由在这里使用<code>partial</code>或<code>partialmethod</code>:</p>
<pre><code>from functools import partial
class ClassWithDecorator:
def __init__(self):
self.decorator_param = "PARAM"
def my_decorator(self, decorated_func):
def my_callable(*args, **kwargs):
# Do something with decorator_param
print(self.decorator_param)
return decorated_func(*args, **kwargs)
return my_callable
decorator_instance = ClassWithDecorator()
class WillCallDecorator:
def __init__(self):
self.other_param = "WillCallDecorator variable"
@decorator_instance.my_decorator
def decorated_method(self):
pass
WillCallDecorator().decorated_method()
</code></pre>
<p>另外,为了回答代码为什么不工作的问题,当您访问<code>something.decorated_method()</code>时,代码会检查<code>decorated_method</code>是否是函数,如果是,则在内部将其转换为调用<code>WillCallDecorator.decorated_method(something)</code>。但是从<code>partial</code>返回的值是<code>functools.partial</code>对象,而不是<code>function</code>。所以类查找绑定不会在这里发生。你知道吗</p>
<p>更详细地说,<code>something.method(arg)</code>等价于<code>SomethingClass.method.__get__(something, arg)</code>当<code>something</code>没有属性<code>method</code>并且它的类型<code>SomethingClass</code>有属性并且属性有方法<code>__get__</code>时,但是属性查找的全套步骤相当复杂。你知道吗</p>