擅长:python、mysql、java
<p>我不完全清楚您想要什么,但是如果您只想使用修饰函数的参数,那么这正是一个基本的修饰器所做的。所以要访问,比如说,<code>self.request</code>来自装饰器,您可以执行以下操作:</p>
<pre><code>def log_request(fn):
def decorated_get(self):
logging.debug("request object:", self.request)
return fn(self)
return decorated_get
class MyHandler(webapp. RequestHandler):
@log_request
def get(self):
self.response.out.write('hello world')
</code></pre>
<p>如果您试图访问修饰函数附加到的类,那么它有点棘手,您将不得不使用<a href="http://docs.python.org/library/inspect.html" rel="noreferrer">inspect</a>模块进行一些欺骗。</p>
<pre><code>import inspect
def class_printer(fn):
cls = inspect.getouterframes(inspect.currentframe())[1][3]
def decorated_fn(self, msg):
fn(self,cls+" says: "+msg)
return decorated_fn
class MyClass():
@class_printer
def say(self, msg):
print msg
</code></pre>
<p>在上面的示例中,我们从currentframe(在decorator执行期间)获取类的名称,然后将其存储在decorated函数中。在这里,我们只是在将类名称传递给原始的<code>say</code>函数之前,将类名称放在<code>msg</code>变量的前面,但是一旦有了类名称,就可以使用您的想象力来做任何您喜欢的事情。</p>
<pre><code>>>> MyClass().say('hello')
MyClass says: hello
</code></pre>