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 for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python正则表达式使用经典实例
Jun 21 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
python实现超市商品销售管理系统
Oct 25 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
Python 如何批量更新已安装的库
May 26 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 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 常见郁闷问题答解
2006/11/25 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
JavaScript加强之自定义event事件
2013/09/21 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python字典的核心底层原理讲解
2019/01/24 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
Python类class参数self原理解析
2020/11/19 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
岗位职责的构建方法
2014/02/01 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
销售口号大全
2014/06/11 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
2015年度党员个人总结
2015/02/14 职场文书
法律意见书范本
2015/06/04 职场文书
环保宣传语大全
2015/07/13 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python
LeetCode189轮转数组python示例
2022/08/05 Python