python中单例模式

Posted chanper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中单例模式相关的知识,希望对你有一定的参考价值。

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

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

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

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

二、__new__方法:

  • 使用类名()创建对象,Python解释器首先会调用__new__()方法为对象分配空间
  • __new__()是一个由objec基类提供的内置的静态方法,主要作用有两个:
  1. 在内存中为对象分配空间
  2. 返回对象的引用
  • 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 # 实例化phone
13 phone = Phone()
14 print(phone)

三、Python中的单例

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

  技术分享图片

  • 代码:
 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.instance
14 
15     def __init__(self):
16         # 1、判断是否执行过初始化动作
17         if SingletonTest.init_flag:
18             return
19         # 2、如果没有执行过,在执行初始化动作
20         print("初始化对象。。。")
21         # 3、修改类属性标记
22         SingletonTest.init_flag = True
23         #print("初始化对象。。。")
24 
25 singleton1 = SingletonTest()
26 print(singleton1)
27 singleton2 = SingletonTest()
28 print(singleton2)

 

以上是关于python中单例模式的主要内容,如果未能解决你的问题,请参考以下文章

python中单例模式的实现-通过闭包函数和魔术方法__new__实现单例模式

Python设计模式中单例模式的实现及在Tornado中的应用

python Python中单例模式的线程安全实现。基于tornado.ioloop.IOLoop.instance()方法。

python __new__中单例的作用

Objective-C中单例模式的实现-备

java中单例设计模式