标签:产生 pes blog init ogg ati 括号 reference enc
转自:http://www.cnblogs.com/xybaby/p/6274283.html
上一篇文章开始的时候提到
“一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者参数)”
有一般情况,就有特殊情况。第一种特殊情况:装饰器可能也是一个类;第二种特殊情况:装饰器返回的对象的类型不一定等同于被装饰对象的类型。
(user-defined functions, built-in functions, methods of built-in objects, class objects, methods of class instances, and certain class instances themselves are callable; extensions may define additional callable object types).
函数(方法)和类是callable,这个是很好理解的,如果一个类定义了__call__方法,那么该类的实例也是callable。另外,
class cost_time_logger(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): import time begin = time.time() try: return self.func(*args, **kwargs) finally: print(‘func %s cost %s‘ % (self.func.__name__, time.time() - begin)) @cost_time_logger def complex_func(num): ret = 0 for i in xrange(num): ret += i * i return ret if __name__ == ‘__main__‘: print complex_func(100000)
功能和上一篇文章的code snippet 0是一样的,但是type(complex_func) 变成了 <class ‘__main__.cost_time_logger‘>,这也说明了第二种情况:被装饰的对象原本是函数,被装饰之后变成了一个类实例。
def singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance @singleton class MyClass: pass if __name__ == ‘__main__‘: print type(MyClass)
标签:产生 pes blog init ogg ati 括号 reference enc
原文地址:http://www.cnblogs.com/zhongguiyao/p/7208533.html