频道栏目
首页 > 资讯 > Python > 正文

python学习~元类

13-05-13        来源:[db:作者]  
收藏   我要投稿

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


[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'

 

相关TAG标签
上一篇:oracle到mysql的迁移步骤及各种注意事项
下一篇:未能加载文件或程序集“file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站