Python 我想在类中修饰一个方法,但不编辑class.py——内部的详细信息
Twython模块在内部使用requests模块 我想包装/修饰请求的Python 我想在类中修饰一个方法,但不编辑class.py——内部的详细信息,python,class,decorator,wrapper,python-decorators,Python,Class,Decorator,Wrapper,Python Decorators,Twython模块在内部使用requests模块 我想包装/修饰请求的requests.post(*k,**kw)方法,以便Twython发出请求的所有内容。post(…)调用它将被透明地装饰/包装,而不会干扰Twython模块 如果我编辑了requests代码库,那就很容易了,但是我想知道如何解决向已经定义的函数/方法添加decorator的一般问题 import requests def magic_wrapper_doodad(...) ... ... requests.post = ma
requests.post(*k,**kw)
方法,以便Twython发出请求的所有内容。post(…)
调用它将被透明地装饰/包装,而不会干扰Twython模块
如果我编辑了requests代码库,那就很容易了,但是我想知道如何解决向已经定义的函数/方法添加decorator的一般问题
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):
...
如何编写
magic\u wrapper\u doodad()
-或其他代码-以便我可以这样装饰代码?Decorator@
符号只是一种语法糖,用于调用装饰函数,并用装饰函数替换装饰函数
换句话说,以下两个例子是完全相同的:
@yourdecorator
def a_function():
pass
def b_function():
pass
b_function = yourdecorator(b_function)
这同样适用于类定义中的方法
因此,您可以通过将类方法替换为decorator可调用的结果来简单地修饰类方法:
requests.post = my_function(requests.post)
这与您所写的内容相同:
class requests(object):
@my_function
def post(self, *args):
pass
请注意,在您的案例中,
请求实际上是一个模块,而不是一个类,但同样的原则也适用。您所寻找的可能是通过面向方面的编程实现的
查看Stackoverflow的这篇文章,如果有帮助,请告诉我:
如果您需要装饰请求功能,那么这是一种方法。我只是想提一下,请求确实有
如果你能用钩子做你需要做的事情,你应该这样做。它比猴子补丁更干净。@jterrace:s
字符正确插入。请求是一个模块,而不是一个类+1@jterrace:是的,OP的问题措辞表明他/她认为这是一门课;我正在添加模块注释。是的,这是非常确定的,但是。。。函数似乎没有包装。我的实际代码并不像twython/requests示例那样直截了当,但我认为它在功能上是等效的,显然,我想我在某个地方发现了一些可疑的东西,可能会影响日志/输出。如果你在获得对unwrapped函数的引用后进行包装,引用不会自动为您包装。例如,在导入Twyton之前尝试导入请求。我知道钩子,我想修饰请求
调用有几个不同的原因,其中一个原因是自动向请求添加钩子。如果不修饰请求。get
/请求。post
方法或修改Twython
的代码,理想情况下如何实现这一点?