七、面向对象之单例设计模式
一、"""单例设计模式:通俗的讲就是单个实例对象
设计模式:前人在工作中,为了做需求写代码积累的一种代码设计思想,我们根据套路来就行了
>>>>>>>
之前讲过的创建类实例对象,工作原理是这样的---调用类创建对象,解释器会自动调用__new__这个内置的静态方法为对象分配内存空间
,然后返回这个对象,再将这个对象的引用传给__init__初始化方法进行初始化。这是工作原理,但是在创建多个对象时,给对象分配
内存空间的内存地址是不一样的,也就是多个实例,接下来单例就是要将创建多个对象时,分配的内存空间的内存地址始终是唯一一个,这就叫单例
"""
这幅图是描述调用类创建对象时的工作原理:
实现单例的代码:
class Person(object): instance_neicun = None # 用类属性记录创建对象时的内存地址 def __new__(cls, *args, **kwargs): # 重写new方法 if cls.instance_neicun is None: cls.instance_neicun = super().__new__(cls) # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态 #方法,调用时需要传递cls参数 return cls.instance_neicun # new方法需要返回一个对象, def __init__(self): print('初始化开始...') a = Person() print(a) b = Person() print(b)
输出结果:
初始化开始...
<单例设计模式.Person object at 0x0000000001730748>
初始化开始...
<单例设计模式.Person object at 0x0000000001730748>
此时你会发现,我创建俩个对象时,内存地址都是一样的!
二、上面的代码你会发现,初始化内容每调用一次就会输出一次,那么如果只要输出一次怎么做呢?只需要将上述代码做一点修改就可以了
class Person(object): instance_neicun = None # 用类属性记录创建对象时的内存地址 instance_flag = False # 是否执行过初始化方法的标记 def __new__(cls, *args, **kwargs): # 重写new方法 if cls.instance_neicun is None: cls.instance_neicun = super().__new__(cls) # 用一个变量接收object类中new方法返回的内存地址,new是一个特殊的静态 #方法,调用时需要传递cls参数 return cls.instance_neicun # new方法需要返回一个对象, def __init__(self): # 判断如果初始化方法被调用过一次,就直接返回 if Person.instance_flag is True: return # 如果没有调用过,就进行初始化 print('初始化开始...') # 修改标记 Person.instance_flag = True a = Person() print(a) b = Person() print(b)
输出结果:
初始化开始...
<单例设计模式.Person object at 0x000000000170F668>
<单例设计模式.Person object at 0x000000000170F668>
此时你会发现,创建俩个对象,只输出了一个初始化内容