用python写一个singleton

用python写一个singleton

我们用2种方式来实现singleton, 修饰类的方式和元类的方式:

修饰类的方式

class Singleton:
    def __init__( self, decorated ):
        self._decorated = decorated
    def Instance( self ):
        try:
            return self._instance
        except AttributeError:
            self._instance = self._decorated
            return self._instance

    def __call__( self ):
        raise TypeError( 'single instance allowed' )

@Singleton
class CA:
    def __init__( self ):
        print( 'created' )

要创建CA的实例,不能再用

a = CA()

的方式,这种方式会产生一个异常。

而是通过 Instance()这个方法:

a = CA.Instance()

b = CA.instance()

id(a)

id(b)

你就会发现id(a) 和id(b) 返回是同一个id

 元类的方式

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
     def __init__(self,arg):
         self.arg = arg

测试如下:

my1 = MyClass(“hello”)
my2 = MyClass(“world”)
>>> my1 is my2
True

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示