是否有可能确定函数是哪种类的方法?

时间:2010-10-19 23:05:28

标签: python methods introspection

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

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的来源?

2 个答案:

答案 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函数被传递给装饰器,而声明类后绑定函数可用。

实现此目的的方法是将函数装饰器与metaclassclass decorator结合使用。在任何一种情况下,函数装饰器都可以在函数上设置一个标志,并且元类或类装饰器可以查找它并执行相应的操作。

答案 1 :(得分:1)

没有。您必须将其推迟到decorated_fn()被调用。