飘逸的python 单例模式乱弹 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【meiwen.anslib.com - 电脑资料】

   

方法一:装饰器

    利用“装饰器只会执行一次”这个特点

<code class="language-python hljs ">def singleton(cls):    instances = []# 为什么这里不直接为None,因为内部函数没法访问外部函数的非容器变量    def getinstance(*args, **kwargs):        if not instances:            instances.append(cls(*args, **kwargs))        return instances[0]    return getinstance@singletonclass Foo:    a = 1f1 = Foo()f2 = Foo()print id(f1), id(f2)</code>

方法二:基类

    利用“类变量对所有对象唯一”,即cls._instance

<code class="language-python hljs ">class Singleton(object):    def __new__(cls, *args, **kwargs):        if not hasattr(cls, ‘_instance‘):            cls._instance = object.__new__(cls, *args, **kwargs)        return cls._instanceclass Foo(Singleton):    a = 1</code>

方法三:metaclass

    利用“类变量对所有对象唯一”,即cls._instance

<code class="language-python hljs ">class Singleton(type):    def __call__(cls, *args, **kwargs):        if not hasattr(cls, ‘_instance‘):            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)        return cls._instanceclass Foo():    __metaclass__ = Singleton</code>

方法四:Borg模式

    利用“类变量对所有对象唯一”,即__share_state

<code class="language-python hljs ">class Foo:   __share_state = {}   def __init__(self):       self.__dict__ = self.__share_state</code>

方法五:利用import

    利用“模块只会被import一次”

<code class="language-python hljs ">#在文件mysingleton中class Foo(object):     passf = Foo()</code>

    然后在其它模块,from mysingleton import f

    直接拿f当作单例的对象来用

最新文章