Python 用__new__方法实现单例的操作


Posted in Python onDecember 11, 2020

介绍

init 方法通常用在初始化一个类实例时候,但其实它不是实例化一个类的时候第一个被调用 的方法。当使用 Student(id, name) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。

new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。

new为对象分配空间,是内置的静态方法,new在内存中为对象分配了空间也返回了对象的引用,init获得了这个引用才初始化这个实例。

示例

一个非常简单的单例

class A:
 instance = None
 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

因为new方法是一个静态方法(也就是在定义的时候就没有cls参数),所以在这里要传入一个cls参数,而且这里的new你改造过了,所以要返回爸爸的new方法。

按造这个方法改造的单例怎么new都是同一个实例,但init仍然会被执行多次,也就是创建了几个对象就调用几次初始化方法。所以还要对init再进行一些判断。

class A:
 instance = None
 init_flag = False # 初始化标记

 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

 def __init__(self):
  if A.init_flag:
   return
  print('执行了初始化方法')
  A.init_flag = True

if __name__ == '__main__':
 a = A()
 b = A()
 print(a)
 print(b)

输出结果:

执行了初始化方法

<main.A object at 0x00000210E6F09320>

<main.A object at 0x00000210E6F09320>

总结

通过重载new方法,可以比较简单地实现单例,Python还有很多有趣的内置函数,有空可以再研究研究。

补充知识:Python饿汉式和懒汉式单例模式的实现

看代码吧~

# 饿汉式
class Singleton(object):
 # 重写创建实例的__new__方法
 def __new__(cls):
  # 如果类没有实例属性,进行实例化,否则返回实例
  if not hasattr(cls, 'instance'):
   cls.instance = super(Singleton, cls).__new__(cls)
  return cls.instance

饿汉式在创建的时候就会生成实例

# 懒汉式
class Singleton(object):
 __instance = None
 def __init__(self):
  if not self.__instance:
   print('调用__init__, 实例未创建')
  else:
   print('调用__init__,实例已经创建过了:', __instance)

 @classmethod
 def get_instance(cls):
  # 调用get_instance类方法的时候才会生成Singleton实例
  if not cls.__instance:
   cls.__instance = Singleton()
  return cls.__instance

以上这篇Python 用__new__方法实现单例的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之用Python计算
Sep 12 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
Python 中的lambda函数介绍
Oct 10 Python
解决python opencv无法显示图片的问题
Oct 28 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
Python实现分段线性插值
Dec 17 Python
Pytorch中index_select() 函数的实现理解
Nov 19 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
python 实现图像快速替换某种颜色
Jun 04 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
Flask处理Web表单的实现方法
Jan 31 Python
python实现图像高斯金字塔的示例代码
Dec 11 #Python
Pycharm plot独立窗口显示的操作
Dec 11 #Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 #Python
使用python操作lmdb对数据读取的实例
Dec 11 #Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 #Python
python中append函数用法讲解
Dec 11 #Python
python实现图像随机裁剪的示例代码
Dec 10 #Python
You might like
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
js实现图片轮换效果代码
2013/04/16 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
战友聚会邀请函
2014/01/18 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
个人专业技术总结
2015/03/05 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL
python中的random模块和相关函数详解
2022/04/22 Python