python中单例模式,,一、单例模式设计基础


一、单例模式设计基础概念:

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

目的:让类创建对象,在系统中只有唯一的一个实例子

每一次执行类名()返回的对象、内存地址是相同的

二、__new__方法:

使用类名()创建对象,Python解释器首先会调用__new__()方法为对象分配空间
__new__()是一个由objec基类提供的内置的静态方法,主要作用有两个:在内存中为对象分配空间
返回对象的引用Python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__()方法
重写__new__方法的代码是非常固定的而且是非常重要的!重写__new__()方法一定要return super().__new__(cls)否则Python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法(备注:__new__()是一个静态方法,在调用时需要主动传递cls参数)

  代码:

 1 class Phone(object): 2     def __new__(cls, *args, **kwargs): 3         # 1、创建对象时,new方法会被自动化调用 4         print("创建对象,分配空间") 5         # 2、为对象分配空间 6         instance = super().__new__(cls) 7         # 3、返回对象的引用 8         return instance 9     def __init__(self):10         print("手机初始化...")11 12 # 实例化phone13 phone = Phone()14 print(phone)

三、Python中的单例

单例:让类创建的对象,在系统中只有唯一的一个实例:
定义一个类属性,初始值是None,用于记录单例对象的引用
重写__new__()方法如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果返回类属性中记录的对象引用视图模型

  技术分享图片

代码:
 1 class SingletonTest(object): 2     # 记录一个被创建对象的引用(此处加个类属性,主要是为了保障类返回地址的唯一性) 3     instance = None 4  5     # 记录是否执行过初始化方法(未做标记处理的话,在初始化过程中会被执行多次) 6     init_flag = False 7     def __new__(cls, *args, **kwargs): 8         # 1、判断类属性是否是空对象 9         if cls.instance is None:10             # 2、调用父类的方法,为第一个对象分配对象11             cls.instance = super().__new__(cls)12         # 3、返回类属性保存的对象引用13         return cls.instance14 15     def __init__(self):16         # 1、判断是否执行过初始化动作17         if SingletonTest.init_flag:18             return19         # 2、如果没有执行过,在执行初始化动作20         print("初始化对象。。。")21         # 3、修改类属性标记22         SingletonTest.init_flag = True23         #print("初始化对象。。。")24 25 singleton1 = SingletonTest()26 print(singleton1)27 singleton2 = SingletonTest()28 print(singleton2)

python中单例模式

评论关闭