python学习~元类


元类是类的模版,在类的层次上规范类的行为。
下面使用元类实现单例设计模式(设计模式九 采用的是另一种方式):


[python]
<P>from  warnings import *           </P> 

from  warnings import *          
[python]
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)     
        

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'

 

相关内容

    暂无相关文章

评论关闭