元类是类的模版,在类的层次上规范类的行为。
下面使用元类实现单例设计模式(设计模式九 采用的是另一种方式):
from warnings import *
class SingletonMeta(type):
__instance=None
__mutex=threading.Lock()
def __init__(cls,name,bases,dic):
super(SingletonMeta,cls).__init__(name,bases,dic)
cls.__instance = None
if '__str__' not in dic :
#raise TypeError("class requires overriding of __str__()")
warn("class '%s ' requires overriding of __str__()\n"%name,stacklevel=3)
def __call__(cls,*args,**kwargs):
if cls.__instance is None:
cls.__mutex.acquire()
if cls.__instance is None:
cls.__instance = super(SingletonMeta,cls).__call__(*args,**kwargs)
else:
cls.__instance.__init__(*args,**kwargs)
cls.__mutex.release()
else:
cls.__instance.__init__(*args,**kwargs)
return cls.__instance
class Single(object):
__metaclass__ = SingletonMeta
def __init__(self,name):
print(name)
def __str__(self):
return self.__class__.__name__
#客户端
if(__name__=="__main__"):
singleton1=Single("hello")
singleton2=Single("world")
if singleton1 is singleton2:
print("they are the same object of class '%s'"%singleton1)
运行结果:
hello
world
they are the same object of class 'Single'