可以确定函数是方法的哪个类?
作者:互联网
例如,如果我要装饰这样的方法
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的来源?
解决方法:
简短答案:不可以.
更长的答案:您可以通过在堆栈跟踪中进行处理(请参阅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"
您可以看到原始函数已传递给装饰器,而绑定的函数在声明类后可用.
完成此操作的方法是仅将函数装饰器与metaclass或class decorator结合使用.在任何一种情况下,函数装饰器都可以在函数上设置一个标志,而元类或类装饰器可以查找它并执行适当的操作事情.
标签:introspection,python,methods 来源: https://codeday.me/bug/20191105/1997313.html