例如,如果我正在装饰这样的方法
def my_decorator(fn):
# Do something based on the class that fn is a method of
def decorated_fn(*args, **kwargs):
fn(*args, **kwargs)
return decorated_fn
class MyClass(object):
@my_decorator
def my_method(self, param):
print "foo"
my_decorator中是否可以确定fn的来源?
答案 0 :(得分:3)
简短回答:否。
更长的答案:您可以通过在堆栈跟踪中查看(请参阅inspect
模块)来实现这一点,但这不是一个好主意。
完整答案:在功能被装饰时,它仍然是一个未绑定的功能。请尝试以下方法:
def my_dec(fn):
print dir(fn) # Has "func_code" and "func_name"
return fn
class A(object):
@my_dec
def test(self):
pass
print dir(A.test) # Has "im_class" and "im_self"
你可以看到raw函数被传递给装饰器,而声明类后绑定函数可用。
实现此目的的方法是将函数装饰器与metaclass或class decorator结合使用。在任何一种情况下,函数装饰器都可以在函数上设置一个标志,并且元类或类装饰器可以查找它并执行相应的操作。
答案 1 :(得分:1)
没有。您必须将其推迟到decorated_fn()
被调用。