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使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
Python Web框架Tornado运行和部署
Oct 19 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
python编写计算器功能
Oct 25 Python
Python创建数字列表的示例
Nov 28 Python
Python如何输出整数
Jun 07 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 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实现javascript的escape和unescape函数
2013/06/29 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
nodejs基础应用
2017/02/03 NodeJs
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
vue实现购物车案例
2020/05/30 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
python合并文本文件示例
2014/02/07 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
python区块及区块链的开发详解
2019/07/03 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
运动会表扬稿大全
2014/01/16 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
某某同志考察材料
2014/05/28 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
毕业设计论文评语
2014/12/31 职场文书
新郎答谢词
2015/01/04 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书