我正在尝试创建一个装饰器,该装饰器将验证参数是否存在并检索被装饰的方法的名称。
我能够在函数的第二层而不是第一层中访问方法的名称。
例如,我有这个装饰器
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>,)
答案 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)