单例模式:即一个类有且仅有一个实例。

那么通过python怎么实现一个类只能有一个实例呢。

class Earth:"""假如你是神,你可以创造地球"""print '欢迎来到地球'# 生成一个地球
a = Earth()
print id(a)# 再生成一个地球
b = Earth()
print id(b)

输出:

欢迎来到地球
53356616
59869960

从上面例子可以看到,地球被创建了两次,因为地球只能有一个,所以Earth类只能有一个实例,所以需要单例模式实现。

python中,一个类创建对象实例是通过调用父类object的 __new__(cls)方法来创建对象的

我们可以通过重写 __new__(cls)方法去实现类只创建一个实例,再创建的实例返回上一次的对象的引用。

class Earth(object):"""假如你是神,你可以创造地球"""# 定义一个类属性做判断instance = Nonedef __new__(cls, *args, **kwargs):# 如果instance为空则说明是第一次创建实例# 通过父类的__new__(cls)创建实例if cls.instance == None:# 调用父类的__new__(cls)方法创建实例,并将该实例赋值给类变量instance,此时该变量的值从None变为该实例cls.instance = object.__new__(cls)# print cls.instance# 返回实例化对象return cls.instanceelse:# 返回上一个对象的引用return cls.instance# print '欢迎来到地球'print '原始的instance值为:%s' % Earth.instance# 生成一个地球
a = Earth()
# 创建实例后的instance值
print '创建实例后的instance值为:%s' % Earth.instance
print id(a)# 再生成一个地球
b = Earth()
print id(b)

输出:

原始的instance值为:None
创建实例后的instance值为:<__main__.Earth object at 0x0000000003090E10>
50925072
50925072

可以看到两次的id相同,为同一个对象

参考:https://blog.csdn.net/CtyCt_/article/details/79677125

多种实现单例模式:https://www.cnblogs.com/huchong/p/8244279.html

转载于:https://www.cnblogs.com/gcgc/p/11585444.html

python:单例模式--使用__new__(cls)实现相关推荐

  1. python单例模式基于__new__方法实现的单例模式(推荐使用,方便)

    单例模式以及Python实现 单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. 比如,某个服务器的配置信息存在在一个文件中,客户端通过Ap ...

  2. Python 单例模式

    #单例模式 class Dog(object):#定义一个类变量#None相当于c++中的NULL,修饰基本类型和类类型均可instance = None#重写__new__方法def __new__ ...

  3. python中__init__后面加特殊符号_详解Python中的__new__、__init__、__call__三个特殊方法...

    __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是sel ...

  4. Python单例模式中几种实现及优化方法

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

  5. python 单例模式的四种创建方式

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

  6. python单例模式的五种实现方式

    __new__特殊方法实现 class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls ...

  7. print python 如何加锁_深度解密Python单例模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...

  8. python单例模式解析_Python下简易的单例模式详解

    Python 下的单例模式 要点: 1.某个类只能有一个实例: 2.它必须自行创建这个实例: 3.它必须自行向整个系统提供这个实例 方法:重写new函数 应该考虑的情况: 1.这个单例的类可能继承了别 ...

  9. 以下哪个选项不是单例模式的优点_深度解密Python单例模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式. 1. 认识单例模式 认识 ...

最新文章

  1. python初学者教程我要自学网-我要自学网--json 数据解析-python。
  2. 测试人员必学的软件快速测试方法(三)
  3. emui10如何降级_如何评价EMUI10按包名降分辨率机制的行为?
  4. Lua初学习 9-12 基础
  5. 前端学习(1370):错误处理中间件
  6. 他是世界首位惯性导航博士!如今101岁,依然对航天事业激情澎湃
  7. jQuery 为动态添加的元素绑定事件
  8. python整数缓存问题
  9. 自学python书籍怎么选-学习Python可以看书籍学习吗?老男孩Python入门课程
  10. Python实现股票数据下载工具
  11. dw2xls已升级至pb11.5
  12. Unity3D 学习 代码
  13. 写字机器人开发之:python opencv linux下合作操作摄像头
  14. Redis:字符串SET、SETNX、SETEX、PSETEX、GET、GETSET命令介绍
  15. cdsn cbi_CBI的完整形式是什么?
  16. 【计算机视觉】回顾2022年计算机视觉领域最激动人心的进展
  17. win10蓝牙已配对连接不上_手把手帮您win10系统显示蓝牙已配对但未连接的设置教程...
  18. mysql 退出fdisk_Linux fdisk命令
  19. 学习hadoop大数据基础框架需要什么基础
  20. subprocess的用法

热门文章

  1. 如何将.crt的ssl证书文件转换成.pem格式
  2. hdu 1542/1255 Atlantis/覆盖的面积
  3. Knockoutjs官网翻译系列(一)
  4. Eclipse 构建Maven项目
  5. ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
  6. Duplicate standby database from active database
  7. Lrc歌词-开发标准 (转)
  8. node搭建服务器,写接口,调接口,跨域
  9. 2 Hadoop的安装与配置
  10. 使用deploy命令上传jar到私有仓库