sen*_*nte 2 python class decorator wrapper python-decorators
Twython模块在内部使用请求模块.
我想包装/装饰请求的requests.post(*k, **kw)方法,所以Twython进行request.post(...)调用它将被透明地装饰/包裹,而不会干扰Twython模块.
如果我编辑了请求代码库,这很容易,但我很好奇如何解决向已定义的函数/方法添加装饰器的一般问题.
import requests
def magic_wrapper_doodad(...)
...
...
requests.post = magic_wrapper_doodad(my_function, requests.post) # plz?
import Twython
# thanks to the above magic, requests.post is wrapped just as if it was defined like:
@decorator
def trace(f, *args, **kw):
print("calling %s with args %s, %s" % (f.__name__, args, kw))
return f(*args, **kw)
...
... #inside requests.py now:
@trace
def post(self, *args, **kw):
...
Run Code Online (Sandbox Code Playgroud)
我该怎么写magic_wrapper_doodad()- 或者一些替代代码 - 所以我可以像这样装饰代码?
Decorator @表示法只是用于调用装饰函数调用的装饰器的语法糖,并用结果替换装饰函数.
换句话说,以下两个例子完全相同:
@yourdecorator
def a_function():
pass
def b_function():
pass
b_function = yourdecorator(b_function)
Run Code Online (Sandbox Code Playgroud)
这同样适用于类定义中的方法.
因此,您可以通过将类方法替换为装饰器可调用的结果来简单地修饰类方法:
requests.post = my_function(requests.post)
Run Code Online (Sandbox Code Playgroud)
这和你写的一样:
class requests(object):
@my_function
def post(self, *args):
pass
Run Code Online (Sandbox Code Playgroud)
请注意,在您的情况下requests,实际上是一个模块,而不是一个类,但适用相同的原则.