单例设计模式
有关的知识点
class A(object):
def __init__(self):
print("这是 init 方法")
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls) #返回的是一个实例了的对象 就是self
__new__至少要有一个参数cls,代表要实例化的类(一般就是本类),此参数在实例化时由Python解释器自动提供
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,
可以return父类__new__出来的实例(父类没有自己实现的话还是会去找基类的),或者直接是object的__new__出来的实例
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
# 实例化一个单例
class Singleton(object):
__instance = None # 私有类的属性(就是私有了一个类的对象)
def __new__(cls, age, name): # 这个方法会返回一个对象 就是self对象
# 如果类属性中是否指向了一个对象 如果没有
# 那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
# 能够知道之前已经创建过对象了,这样就保证了只有1个对象
if not cls.__instance: # 判断类的属性是否存在
cls.__instance = object.__new__(cls) # 不能存在就创建一个类的是实例对象
return cls.__instance # 返回类的实例对象
保证单例的设计模式只能初始化一次
如果只是简简单单的完成了类的单例 那么当去创建一个对象并调用init(self) 方法的时候 当创建多个对象 并初始化多次的时候 最后初始化的属性
会覆盖前面初始化过的属性,为了防止多次的初始化 我们可以在初始化中在加一层判断
class Demo:
__instance=None # 用于单例创建时对象的赋值和引用
__flag=False # 用于控制初始化时的判断
def __new__(cls,*args):
if not cls.__instance: # 判断对象是否存在
cls.__instance=object.__new__(cls) # 把创建的对象赋值给 类的属性
return cls.__instance # 返回创建的对象
def __init__(self,name):
if not Demo.__falg: # 判断标志位
self.name=name # 初始化对象的属性值
Demo.__falg=True # 设置标志位 这样当下次再创建对象的时候就不会在进行初始化操作了
demo=Demo("haha")
print(id(demo)) # 打印对象的内存地址
print(demo.name) # 打印属性
# 创建对象2
denmo2=Demo("hehe")
print(id(demo2)) # 打印对象的内存地址
print(demo2.name) # 打印属性
结果:
139798882285720
haha
139798882285720
haha