获取装饰类方法的类名

考虑这种情况:

#!/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的方法,表示该方法所链接的类。

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

先谢谢你。


这并不容易。 如果您将self添加为内部函数的第一个参数,则可以使用self.__class__.__name__来访问类名称,但是当装饰无参函数的无类别函数时会中断它(如果有参数,则会考虑第一个参数作为self论点)。

因此,除非有方法来确定函数是否在对象上下文中被调用,或者不是您想做的事情,否则不可行。

Btw ..你需要什么? 这听起来像是可以以更好的方式解决的问题。


实际上,您可以使用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

这将打印方法模块,类和名称,或只是模块和名称,如果这是一个功能

链接地址: http://www.djcxy.com/p/4881.html

上一篇: Get the class name of a decorated class method

下一篇: Argparse optional positional arguments?