在Python中,如何获取带有参数传递给我的装饰器的函数的名称?

时间:2019-07-10 20:48:24

标签: python methods decorator python-decorators

我正在尝试创建一个装饰器,该装饰器将验证参数是否存在并检索被装饰的方法的名称。

我能够在函数的第二层而不是第一层中访问方法的名称。

例如,我有这个装饰器

def p_decorate(name, *a, **k):
    print(name + ' is at object: ')
    print a #I would like to get the method object here
    def fn(*a, **k)
        print a #object prints here instead
    return fn
return p_decorate

我想装饰这个班

class Person(object):
    @p_decorate('John')
    def get_fullnameobject(self):
        return self.name

我希望它能打印:

John is at object: (<function get_fullnameobject at 0x000000003745A588>,)
(<function get_fullnameobject at 0x000000003745A588>,)

但是输出是:

John is at object: ()
(<function get_fullnameobject at 0x000000003745A588>,)

2 个答案:

答案 0 :(得分:1)

函数p_decorate被调用 且仅带有参数John*a**k均为空),因此您为a获取一个空元组。

请注意,返回的fn可调用对象是被调用的,之后是get_fullnameobject可调用对象。

更重要的是,您当前的实现是不完整的,因为您永远无法调用该方法-您需要另一个闭包才能真正做到这一点。

答案 1 :(得分:1)

您需要另一个嵌套函数来定义一个接受参数的装饰器。

def p_decorate(name):
    def _(f):
        print(name + ' is at object: ')
        print f
        def fn(*a, **k):
            # Do something, but ultimately you probably want to call f
            ...
        return fn
    return _

p_decorate("John")返回实际的修饰符,该修饰符将get_fullnameobject作为其f参数,并返回要绑定到fn的新get_fullnameobject对象。没有装饰器语法,用法看起来像

def get_fullnameobject(self):
    return self.name

get_fullnameobject = p_decorate("John")(get_fullnameobject)