单例模式是一种经常使用的设计模式,其定义解释很好理解,核心是一个实例对象,更加详细的解释就更是百度一个一大堆了,这里说 Python 中单例模式的实现的几种方法:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
使用模块
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc
文件,当第二次导入时,就会直接加载 .pyc
文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
1 # a.py中的内容 2 3 class Student(object): 4 def eat(): 5 pass 6 7 s = Student() 8 9 10 # b.py中的内容 11 12 from a import s 13 14 ## a.py和b.py在同一路径下
使用 __new__ 方法
__new__()
在__init__()
之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例 这个绝对常考
1 class Singleton(object): 2 3 _instance = None 4 def __new__(cls, *args, **kwargs): 5 if not cls._instance: 6 cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) 7 return cls._instance
在上面的代码中,我们将类的实例和一个类变量 _instance
关联起来,如果 cls._instance
为 None 则创建实例,否则直接返回 cls._instance
。
使用装饰器
装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例
1 from functools import wraps 2 3 def singleton(cls): 4 instances = {} 5 @wraps(cls) 6 def getinstance(*args, **kwargs): 7 if cls not in instances: 8 instances[cls] = cls(*args, **kwargs) 9 return instances[cls] 10 return getinstance 11 12 @singleton 13 class MyClass(object): 14 a = 1
使用 metaclass
元类(metaclass)可以控制类的创建过程,它主要做三件事:
- 拦截类的创建
- 修改类的定义
- 返回修改后的类
1 class Singleton(type): 2 _instances = {} 3 def __call__(cls, *args, **kwargs): 4 if cls not in cls._instances: 5 cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 6 return cls._instances[cls] 7 8 9 10 class MyClass(metaclass=Singleton): 11 pass