对 python 修饰方法的反思

Introspection on a python decorated method

我需要对 python 2.7 中的修饰方法进行一些反思。通常我使用 getattr(my_module, 'my_method') 但以下情况 returns 我是装饰器的外部函数。

my_module.py

def my_decorator(function):
    def outer():
        return function()
    return outer

@my_decorator
def my_method():
    pass

现在 shell:

>>> import my_module
>>> getattr(my_module, 'my_method')
<function outer at 0x7f46958aa668>

怎样才能真正得到自己感兴趣的功能

您可以通过检查 my_method.__closure__ 属性(在 Python3 中)或 my_method.func_closure(在 Python2 中)来访问未修饰的函数:

def my_decorator(function):
    def outer():
        print('outer')
        return function()
    return outer

@my_decorator
def my_method():
    print('inner')

try:
    # Python2
    my_method.func_closure[0].cell_contents()
except AttributeError:
    # Python3
    my_method.__closure__[0].cell_contents()

打印

inner