单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
__new__()
在__init__()
之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例
在 Python 中,我们可以用多种方法来实现单例模式:
- 使用模块
- 使用
__new__
- 使用装饰器(decorator)
- 使用元类(metaclass)
其实,python的模块就是天然的单例模式
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
以上保存为mysingleton.py文件
from mysingleton import my_singleton
my_singleton.foo()
__new__方法:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Myclass(Singleton):
a = 1
one = Myclass()
two = Myclass()
print(one == two)
print(id(one), id(two)) #id是查看变量,对象的内存地址,是一串数字号码组成。
output:
True
140681619835480 140681619835480
使用装饰器:
from functools import wraps
def singleton(cls):
instances = {}
@wraps(cls)
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
a = 1
one = MyClass()
two = MyClass()
print(one == two)
print(id(one), id(two))
output:
True
140282556684664 140282556684664
使用元类__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]
#python2
class Myclass(object):
__metaclass__ = Singleton
#python3
class Myclass(metaclass = Singleton):
pass
one = Myclass()
two = Myclass()
print(one == two)
print(id(one), id(two))
output:
True
140493683038808 140493683038808
id值是不断变化的,但one和two两者id始终都是相等的。