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模块的天然单例模式一般情况下够用了, 装饰器感觉也比较好用。
网友评论