|
python中经常使用到装饰器来修饰函数,但是装饰器还可以修饰class。
对于一个函数装饰器,主要是返回一个修饰过的函数,class的装饰器原理类似。
# coding: utf-8
def add_method(cls):
class _newClass(cls):
def __init__(self):
print '_newClass'
# cls.__init__(self)
super(_newClass, self).__init__()
def new_method(self):
print 'new_method'
return _newClass
@add_method
class Test(object):
def __init__(self):
print 'init'
def hello(self):
print 'hello'
if __name__ == '__main__':
t = Test()
t.hello()
t.new_method()
我们看到,在add_method这个装饰器中重新定义一个class继承Test,增加了一个新的成员函数,然后将新的类返回。
这样等于是对原来的Test类进行了修饰。现在生成的对象t不仅仅可以调用原来的函数,还可以调用新增加的函数,看起来就像装饰器给它增加了一个类。
单例模式
代码如下:
# coding: utf-8
def add_method(cls):
class _newClass(cls):
def __init__(self):
print '_newClass'
# cls.__init__(self)
super(_newClass, self).__init__()
def new_method(self):
print 'new_method'
return _newClass
def singleton(cls):
instances = {}
def _singleton(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton
@singleton
class Test(object):
def __init__(self):
print 'init'
def hello(self):
print 'hello'
if __name__ == '__main__':
for i in range(10):
t = Test()
print>
singleton这个装饰器跟上面不同,它返回一个产生实例的函数,这个函数无论调用多少次,产生的都是同一个对象。
原因在于:这里返回_singleton,而_singleton内部又引用了instances这个函数内的对象,这就是所谓的闭包。
当调用一次Test产生一个对象t后,产生了一个闭包,这个instances始终存在。不停的调用Test()实质上是在不同的调用这个闭包。
这就是python中单例模式的原理。 |
|
|