1.使用new
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = "a"
class Single(object):
def __new__(cls, *args, *kw):
if not hasattr(cls, "_instance"):
cls._instance = super(Single, cls).__new__(cls, *args, *kw)
return cls._instance
class MyClass(Single):
a = "a"
2.使用模块
Python 的模块是天然的单例模式
1.模块在第一次导入时,会生成.py文件
2.在以后使用时,就会直接加载.py文件,而不会再次执行模块代码.
3.因此,我们只要把相关的函数和常量定义在一个模块里,就可以获得一个单例对象了
最简单的例子,——配置文件Config.py
import your_module
your_module.fun()
这已经是在使用一个单例
3.通过共享属性
创建实例时把所有实例的dict指向同一个字典,
这样它们具有相同的属性和方法.
class Common(object):
__common_dict = {}
def __new__(cls, *args, **kw):
new_instance = super(Common, cls).__new__(cls, *args, **kw)
new_instance.__dict__ = cls.__common_dict
return new_instance
class MyClass(Common)
a = "a"
4.通过装饰器
在python中一切皆对象
instances是single函数的一个属性,
在函数内部可以使用,并不会每次都创建或者销毁
def single(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@single
class MyClass:
a = "a"