在decorator python 2.7

时间:2015-08-31 18:57:04

标签: python

如何使用Python 2.7获取装饰器包装的方法类?

使用此代码:

def timeit(method):
    def timed(*args, **kw):
        result = method(*args, **kw)

        className = ???
        print '%s.%s'%(className, method.func_name)
        #want printed: Test.run  

        return result

    return timed

class Test(object):
    @timeit 
    def run(self, ):
        print 'run'

a = Test()
a.run()

我不确定要为className = ???放什么。我想要它打印Test.run。

我见过使用im_class和__ self__的类似解决方案,但我也没有。

1 个答案:

答案 0 :(得分:4)

您可以只分析方法的function concat(a,b){ return a.concat(b); } concat("Foo", "bar"); //"Foobar" 参数。

self

如果它是def timeit(method): def timed(self, *args, **kw): result = method(self, *args, **kw) className = type(self).__name__ print '%s.%s'%(className, method.func_name) #want printed: Test.run return result return timed class Test(object): @timeit def run(self): print 'run' a = Test() a.run() 那么您可以使用两个装饰器(即classmethod)并通过@classmethod @timeit获取名称(其中cls.__name__是第一个参数cls代替timed)。

如果它是self,您必须将其变为staticmethod才能获得具有班级信息的参数。