2016-03-03 59 views
0

我有一個名爲profiled的裝飾器,用於跟蹤函數被調用的次數。全局變量在裝飾器中

class profiled(object): 
    def __init__(self,f): 
     self.__count=0 
     self.__f=f 
     self.__name__=f.__name__ 
    def __call__(self,*args,**dargs): 
     self.__count+=1 
     return self.__f(*args,**dargs) 
    def count(self): 
     return self.__count 
    def reset(self): 
     self.__count=0 

我將如何使計數變量全球化,所以,當我用variaous功能異形,總數量將被存儲,而不是僅僅具有一定功能的計數。

+0

你可以使用python類變量而不是實例變量嗎? –

+0

我不這麼認爲。 –

+0

難道你不能......讓'count'成爲一個全局變量?儘管我認爲一個類變量也會起作用。 – larsks

回答

0

您需要使用類屬性,並且您需要確保您永遠不會直接在self上分配它(這將創建一個影射類屬性的實例屬性)。你可以通過改變這樣做:

class profiled(object): 
    def __init__(self,f): 
     self.__count=0 
     self.__f=f 
     self.__name__=f.__name__ 
    def __call__(self,*args,**dargs): 
     self.__count+=1 
     return self.__f(*args,**dargs) 
    def reset(self): 
     self.__count=0 

到(在線路的變化註釋):

class profiled(object): 
    __count=0 # Class attribute shared for all @profiled functions 
    def __init__(self,f): 
     self.__f=f 
     self.__name__=f.__name__ 
    def __call__(self,*args,**dargs): 
     type(self).__count+=1 # Increment __count on the type, not the instance 
     return self.__f(*args,**dargs) 

    # Use a classmethod here, since we don't need self at all 
    @classmethod 
    def reset(cls): 
     cls.__count=0 

count方法無需改變(雖然你可能也使它成爲一個@classmethod,因爲沒有具體的實例因爲即使作爲一種實例方法,它也只是讀取__count,而不是編寫它,它不會創建實例屬性來影射類屬性,並且無縫地訪問類屬性。