2011-04-07 111 views
1

我對函數的簡單timemark-裝飾:如何知道函數方法在裝飾器中的類的名稱?

def dec_timemark(f): 
    def tmp(*args, **kwargs): 
     sys.stdout.write(strftime("%d.%m.%Y %H:%M:%S") + ' ' + f.__name__ + 
                 ' begin' + "\n") 
     res = f(*args, **kwargs) 
     sys.stdout.write(strftime("%d.%m.%Y %H:%M:%S") + ' ' + f.__name__ + 
                 ' end' + "\n" ) 
     return res 
    return tmp 

典型用法:

class Task(): 
    @dec_timemark 
    def make_torrent(): 
     sleep(10) 

但如何添加到classdecorator名字? (不記錄:「make_torrent begin」,例如「Task.make_torrent begin」)?

回答

3

假設裝修程序被調用的方法,你可以拉的類名出self參數:

def dump(f): 
    def decorated(self, *args, **kwargs): 
     print 'Class: {0}'.format(self.__class__.__name__) 
     print 'Args passed to decorated function: {0}'.format(args) 
     print 'Keyword args passed to decorated function: {0}'.format(kwargs) 
     return f(self, *args, **kwargs) 
    return decorated 

class Test(object): 
    """ 
    >>> Test().test('arg1', 'arg2', kwarg1='kwval1') 
    Class: Test 
    Args passed to decorated function: ('arg1', 'arg2') 
    Keyword args passed to decorated function: {'kwarg1': 'kwval1'} 
    """ 
    @dump 
    def test(*args, **kwargs): 
     pass 
0

這是不可能的dec_timemark()本身的範圍內訪問這些信息,因爲類尚不存在。但是,當調用tmp()時,第一個參數將爲self,因爲.make_torrent()被稱爲實例方法。因此,type(self).__name__應該給你類名。

修改你的例子:

def dec_timemark(f): 
    def tmp(self, *args, **kwargs): 
     cname = type(self).__name__ 
     sys.stdout.write(strftime("%d.%m.%Y %H:%M:%S") + ' ' + cname + '.' + f.__name__ + 
                ' begin' + "\n") 
     res = f(self, *args, **kwargs) 
     sys.stdout.write(strftime("%d.%m.%Y %H:%M:%S") + ' ' + cname + '.' + f.__name__ + 
                ' end' + "\n" ) 
     return res 
    return tmp 
+1

'自.__ name__'不起作用。您必須訪問該類的屬性,而不是實例。 – 2011-04-08 06:55:59

+0

謝謝。我編輯了我的答案以糾正錯誤。 – 2011-04-19 19:43:50

相關問題