2016-03-03 49 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,而不是编写它,它不会创建实例属性来影射类属性,并且无缝地访问类属性。