python单例模式

2018-06-14  本文已影响0人  cabbywang

python单例模式实现方式

使用模板

python模块是天然的单例模式(.pyc文件的存在)

# singleton.py
class A(object):
    def foo(self):
        pass
a = A()
from singleton import a
a.foo()

使用__new__

__new__是用来创建实例的, 控制其创建过程, 只创建一次实例

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        return super(Singleton, cls).__new__(cls, *args, **kwargs)

class A(Singleton):
    pass

one = A()
two = A()
one is two
# Ture

使用装饰器 (decorator)

原理和使用__new__相同

from functools import wraps
def singleton(cls):
    instances = {}
    @wraps(cls)
    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return getinstance

@singleton
class A(object):
    pass

one = A()
two = A()
one is two
# Ture

使用元类 (metaclass)

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

# __metaclass__ = Singleton

# class A(object):
#   pass

class A(metaclass=Singleton):
    pass

one = A()
two = A()
one is two
# True

注释部分没有成功, 可能我现在对metaclass的认知还不够, 之后再做更新。。。

总结:python模块的天然单例模式一般情况下够用了, 装饰器感觉也比较好用。

上一篇 下一篇

猜你喜欢

热点阅读