Python 单例模式
1,单例模式的定义
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
2,单例模式的应用场景
- 需要频繁的进行创建和销毁的对象;
- 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
- 工具类对象;
- 频繁访问数据库或文件的对象。
3,单例模式模式实现方式
1. 利用__new__方法
# 第一种 __new__ class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls) return cls._instance else: return cls._instance class MyClass(Singleton): a = 1 a = MyClass() b = MyClass() print(a.a) print(b.a)
另一种写法
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kwargs) return cls._instance class MyClass(Singleton): a = 123 ret = MyClass() print(ret.a)
2,共享属性 :创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
class Singleton(object): _data = {} def __new__(cls, *args, **kwargs): ob = super(Singleton, cls).__new__(cls, *args, **kwargs) ob.__dict__ = cls._data return ob class MyClass2(Singleton): b = 3 b = MyClass2() print(b.b)
3, 装饰器版本
def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class MyClass(object): def __init__(self, name, age): self.name = name self.age = age c = MyClass("yu", 33) d = MyClass('ad', 88) print(c, d)
4, import 方法 作为python的模块是天然的单例模式