共计 974 个字符,预计需要花费 3 分钟才能阅读完成。
单例模式的一般实现
饿汉式
懒汉式就是通过一个方法才能实现单例,我不是很常用,所以在此就写个饿汉式。以后再补懒汉式。
单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存,即可使用单例模式。
在 python 中新建一个对象会调用 __new__
方法为创建的对象分配其内存空间,并且返回该对象的引用,随后将会传给 __init__
函数进行实例化。
一般情况下并不需要调用 new 方法,当使用单例时这一步是必要的。在重写 new 方法时需要返回当前实例的类 cls:return super().__new__(cls)
。得到了分配的内存空间引用后,开始为对象进行实例化,代码可以简单的写为如下:
class ClassObj(object):
def __new__(cls):
print("进行分配内存")
return super().__new__(cls)
def __init__(self):
print("开始初始化")
cobj = ClassObj()
运行结果如下:
但是以上的代码并没有实现单例模式,这个时候,我们需要对以上代码进行更改。
在使用 new 方法时判断是否已经被实例化:
class ClassObj(object):
instance=None
def __new__(cls):
if cls.instance is None:
cls.instance=super().__new__(cls)
print("进行分配内存")
else:
print("已经分配了")
return cls.instance
def __init__(self):
print("已经分配了")
cobj = ClassObj()
cobj1 = ClassObj()
以上代码在 ClassObj 中,定义了一个成员变量 instance,用来存储分配的空间引用,并且在__new__方法中最后 return instance;假设第一次新建该类对象,instance 为 None 则会进行实例化,假设不为 None,则会提示已经分配了,不会再次分配空间,进行创建。运行结果如下:
以上结果只在第一次新建对象时分配了空间,之后创建对象并没有新建空间。
这时也可以直接输出类对象查看空间:
cobj = ClassObj()
cobj1 = ClassObj()
print(cobj)
print(cobj1)
结果如下是相同的:
正文完