首页 文章

获取已修饰类方法的类名

提问于
浏览
3

考虑这种情况:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import functools

def wrapmethod(f):
    @functools.wraps(f)
    def wrap(*args, **kwargs):
        print '>> %s' % (f.func_name)

        # Here I'll do pre-processing
        r = f(*args, **kwargs)
        # Here I'll do post-processing

        return r

    return wrap

@wrapmethod
def foo():
    pass

class Test(object):
    @wrapmethod
    def foo(self):
        pass

test = Test()
test.foo()
foo()

它会输出这个,正如你在http://codepad.org/Y4xXyjJO中看到的那样:

>> foo
>> foo

我想知道在第一行打印 Test.foo 的方法,指示方法链接到的类 .

有任何想法吗?它有可能吗?

先感谢您 .

2 回答

  • 2

    这不容易实现 . 如果你添加了 self 作为内部函数的第一个参数,你可以使用 self.__class__.__name__ 来访问类名,但是在装饰没有参数的无类函数时它会破坏(如果它有参数,它会认为第一个参数为 self ) .

    因此,除非有办法确定是否已在对象上下文中调用函数,否则无法执行此操作 .

    顺便说一句..你需要什么?这听起来像是可以以更好的方式解决的问题 .

  • 2

    实际上,您可以使用inspect模块来获取函数的签名,并假设您遵循通过第一个参数'self'引用类对象的约定,您可以执行以下操作:

    import inspect  
    def print_name(*_args):
        def _print_name(fn):
            def wrapper(*args, **kwargs):
                try :
                    is_method   = inspect.getargspec(fn)[0][0] == 'self'
                except :
                    is_method   = False
    
                if is_method :
                    name    = '{}.{}.{}'.format(fn.__module__, args[0].__class__.__name__, fn.__name__)
                else :
                    name    = '{}.{}'.format(fn.__module__, fn.__name__)
    
                print (name)
            return  fn(*args,**kwargs)
        return wrapper
    return _print_name
    

    这将打印方法模块,类和名称,或仅打印模块和名称,如果这是一个函数

相关问题