Python 我想在类中修饰一个方法,但不编辑class.py——内部的详细信息

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

Twython模块在内部使用requests模块

我想包装/修饰请求的
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
的代码,理想情况下如何实现这一点?