1 def log_wrapper(func):2      @functools.wraps(func)3      def log_func_name(self, *args, **kws):4           logger.debug(" 调用函数 [%s]", func.func_name)5           logger.debug(" 参数为 :%s, %s", [arg.__unicode__() for arg in args], kws)6           result = func(self, *args, **kws)7           logger.debug(" 返回的结果是 :%s", result.__str__())8           return result9      return log_func_name

这个用于缓存计算量比较大或者需要 IO 的情况,用的时候只要 @Memorized(10) 这样就行了,不用更改原代码的逻辑,看起来比较干净清晰

 1 class Memorized(object): 2      def __init__(self, ttl = 300): 3           self.ttl = ttl 4           5      def __call__(self, func):# 只会调用一次 6           def wrapper(obj, *args): 7  8          cache = obj.__dict__.setdefault("cache", {}) 9          now = time.time()10          key_name = self.func.func_name + str(args)11          try:12              value, timestamp = cache[key_name]13              if now - timestamp > self.ttl:14                   raise KeyError15          except KeyError:16             value = self.func(obj, *args)17             cache[key_name] = (value, now)18          return value19     return wrapper


用于记录谁修改了指定值

 1 import traceback 2 def trace_back(func): 3     def wrapper(*args): 4        infos = traceback.format_stack() 5        infos = ''.join(infos) 6        print infos 7        return func(*args) 8     return wrapper 9 class a(object):10    def __init__(self, x):11        self._x = x12    @property13    def x(self):14       return self._x15    @x.setter16    @trace_back17    def x(self, val):18       self._x = val19 def foo():20    b = a(1)21    b.x = 222 def bar():23    foo()24 bar()