其他分享
首页 > 其他分享> > 可以确定函数是方法的哪个类?

可以确定函数是方法的哪个类?

作者:互联网

例如,如果我要装饰这样的方法

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"

您可以看到原始函数已传递给装饰器,而绑定的函数在声明类后可用.

完成此操作的方法是仅将函数装饰器与metaclassclass decorator结合使用.在任何一种情况下,函数装饰器都可以在函数上设置一个标志,而元类或类装饰器可以查找它并执行适当的操作事情.

标签:introspection,python,methods
来源: https://codeday.me/bug/20191105/1997313.html