最近要用到Python的单例模式,在网上找了些方法。其中使用元类实现十分简洁,也很好用。
因为单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的。
其中代码如下:
class Singleton(type):
def __init__(cls,name,bases,dic):
super(Singleton,cls).__init__(name,bases,dic)
cls.instance = None
def __call__(cls,*args,**kwargs):
if cls.instance is None:
cls.instance = super(Singleton,cls).__call__(*args,**kwargs)
return cls.instance
class MyClass(object):
__metaclass__ = Singleton
关于元类这里有一个帖子,写的非常详细。
http://blog.jobbole.com/21351/?utm_source=rss&utm_medium=rss&utm_campaign=%25e6%25b7%25b1%25e5%2588%25bb%25e7%2590%2586%25e8%25a7%25a3python%25e4%25b8%25ad%25e7%259a%2584%25e5%2585%2583%25e7%25b1%25bb
下面谈谈本人的理解:
在Python中一切皆对象(类(而不仅仅是类的实例)也是对象,比JAVA还彻底哈),
而元类是用来创建其它类的类,默认如果没有指定一个类的__metaclass__熟悉,系统会默认指定type为它的元类。
例如定义一个类Myclass
class MyClass(object):
pass
就相当于调用了
MyClass = type('MyClass', (), {})
也就是说MyClass是一个对象。
例外还需要讲讲类的__call__方法,这有一个帖子讲的比较详细
http://blog.csdn.net/junshao90/article/details/8109790 当一个实例当方法用,而不是调用该实例的方法时,就会调用该实例(类也是实例,例如上面的MyClass)的__call__方法。
现在,让我们重新来理解帖子开始所讲的单例模式的代码,MyClass指定了其__metaclass__属性为Singleton;则定义MyClass就相当于调用了Singleton('MyClass',(),{}),这里Singleton是实例(元类)当做方法调用则会调用其__call__方法。
在这个例子中,MyClass = Singleton(‘MyClass’,(),{}) ,MyClass是一个Singleton对象;
当定义myClass1 = MyClass(),MyClass作为一个对象,当其当方法用是就会调用__call__方法。MyClass(Singleton对象)只有一个instance对象(即MyClass对象),所以MyClass始终只能够实例化一个对象,即实现了单例模式。
如果还有什么不明白的这还有一个帖子可以帮助理解:http://www.2cto.com/kf/201009/74966.html