单例模式是一种经典的设计模式。简单的说,类的单例模式就是只能实例化一次,第一次实例化时实例变量是固定的。
Python中常见的单例模式是None,这是一个非常典型的设计,通常使用if xxx is None或者if xxx is not None来比较操作。
Python实现单例模式
代码如下:
class MyClass:
_instance = None
_first_init = False
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, var1, var2):
cls = type(self)
if not cls._first_init:
self.var1 = var1
self.var2 = var2
cls._first_init = True
如上图,我创建了一个MyClass类,定义了两个类变量。第一个是_instance,负责保存这个类创建的实例。第二个是_first_init,它是一个布尔值,保存类是否是第一次实例化。
在__new__方法(构造函数)中,判断是否有类变量_instance,如果之前实例化过直接返回。如果是第一次实例化,会在_instance类变量上绑定一个实例,使用super().__new__(cls)创建实例,即调用父类object.__new__(MyClass)来创建一个实例。
在__init__方法(初始化函数)中,我们通过cls=type(self)获取到MyClass类,判断是否是第一次实例化。如果是第一次实例化,绑定实例变量。否则什么都不做。
运行效果
我们创建两个实例,来对比
>>> instance1 = MyClass(1, 2)
>>> instance2 = MyClass(7, 5)
>>> id(instance1) == id(instance2)
True
>>> instance2.var1
1
可以看出,两个实例的内存地址是一样的,第一次实例化后变量已经固定,全局不会改变。
这就是单例模式的实现。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 从 Python 列表中删除元素的 3 种方法11/09
- ♥ python如何读写excel09/02
- ♥ python的sys文件是什么11/20
- ♥ 如何实现python的for循环11/16
- ♥ python的sort()错误的原因是什么10/20
- ♥ 将python字典转换为DataFrame的方法有哪些?08/26
内容反馈