python使用__new__创建一个单例模式(单例对象)
#单例模式:使一个类只产生一个对象。他们的id地址都指向同一个内存地址
第一步:理解谁创建了对象
# 单例模式
# 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object,
# 然后调用这个object的new方法来创建一个对象。
# 创建对象后,才会执行__init__方法,进行初始化
# 第一步:
class Person:
__instance = None def __new__(cls, *args, **kwargs):
print("") def __init__(self):
print("创建对象后,进行初始化") p = Person() #结果 1111
#从结果分析:我自己创建的这个new方法,会先执行我自己的new方法,但是并没有产生对象(因为没有执行__init__方法)
# 我们创建对象的时候,是object这个原类帮助我们产生了对象。所以我们要调用父类(object)的new方法来产生一个对象。
第二步理解对象的执行顺序:
# 因此:下面的这个方法才能帮助我们产生一个对象。
class Person:
__instance = None def __new__(cls, *args, **kwargs):
print(111)
obj=object.__new__(cls) # 传入我们要产生对象的这个类
return obj def __init__(self):
print("创建对象后,进行初始化") p1=Person()
#
# 创建对象后,进行初始化 '''
结果分析:
我调用了objcet的__new__方法,帮助我产生了一个对象,并且这个对象也执行了__init__方法。 '''
第三步:理解怎么才能只创建一个对象,通过什么条件来只创建一个对象
# 通过上面两个的案例理解。我知道了我应该调用父类的new方法来创建一个对象,
并且我希望这个,再次创建对象的时候,创建的对象还是刚开始创建的那个对象。
所以我希望用定义的私有变量来做个判断,如果私有变量__instance有值 我则直接
返回刚开始创建的那个对象。如果没有创建,则调用父类new方法创建一个对象。
class Person:
__instance = None def __new__(cls, *args, **kwargs):
print("")
if Person.__instance is None: # 只有第一次的时候,条件是None,所以第一次的时候才创建一个对象,后面的条件都不是false,所以直接返回第一次创建的对象
obj = object.__new__(cls) # 继承调用object的new方法产生一个对象
Person.__instance = obj # 将这个对象赋值给这个类的私有变量__instance return Person.__instance def __init__(self):
print("创建对象后,进行初始化") p1 = Person()
p2 = Person()
p3 = Person()
p4 = Person()
print(id(p1),id(p2),id(p3),id(p4)) 输出结果:显示4个对象的内存地址都一样
416664513336 416664513336 416664513336 416664513336
python使用__new__创建一个单例模式(单例对象)的更多相关文章
- python面向对象学习(七)单例
目录 1. 单例设计模式 单例设计模式的应用场景 2. __new__ 方法 3. Python 中的单例 只执行一次初始化工作 1. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常 ...
- 设计模式(java) 单例模式 单例类
·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...
- iOS 如何创建单例对象
一.什么是单例? 说到单例我就想起了我的java啊 ,不禁感叹起我的大学时光,学了4年的java开发,到现在还是放弃了我的java,踏入了iOS的行列. 算了,入正轨,我现在正是铁树银花的青春美少女, ...
- iOS:创建单例对象的两种方式
单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClas ...
- Spring IoC 中的(Singleton)单例对象创建过程探索
前言 之前将spring framework 源码导入了idea,后来折腾调试了一下,于是研究了一下最简单的singleton对象在spring中是如何创建的.这里所谓的简单,就是指无属性注入,无复杂 ...
- iOS创建安全的单例
创建安全的单例 #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; ...
- 不允许在单例对象中创建Srping容器
spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”
- scala学习手记14 - 单例对象
java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
随机推荐
- Scrapy 教程(九)-日志系统
最新版本的 scrapy 已经废弃了 scrapy.log 的使用,赞成显示调用python标准日志记录. Python 内建日志系统 import logging ### python 内建 log ...
- 基于gulp的前端自动化方案
前言 最近几年前端技术发展日新月异,特别是单页应用的普及.组件化.工程化.自动化成了前端发展的趋势.webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好 ...
- W3C标准下的盒模型与IE盒模型
标准盒模型如下图所示: IE下盒模型如下图所示:
- time和datetime的区别
time在 Python 文档里,time是归类在Generic Operating System Services中,换句话说, 它提供的功能是更加接近于操作系统层面的.通读文档可知,time 模块 ...
- C++ md5类,封装好
在网上看到很多md5类,不过封好的很少,我就在网上看到一篇把他写的封装 头文件 #ifndef _MD5_H #define _MD5_H #pragma warning(disable:4786)/ ...
- FPGA 物理时序不合理的体现(体现方式:数字钟的行扫描和列扫描)
本人在这只讨论建模好的模块来比较解释现象,如有不周到请大家指正. 软件功能仿真和在硬件上的区别:可以从这个数码管的行扫描和列扫描实例来体会一下,物理时序的影响和改进方法. 数码管的行扫描.列扫描要求同 ...
- python打包命令
打包成exe方法 (1)切换到该文件夹 (2)pyinstaller -F py文件 (py文件要英文才行) -F 生成单个可执行文件 -w 去掉控制台窗口 -p 自定义需要加载的类路径 -i 可执行 ...
- Linux文件的操作及授权
需求1:新建除了root之外的新用户,并且新用户具有root用户的相关功能 1.首先修改/etc/sudoers文件具有写入的权限 chmod 777 /etc/sudoers 2.修改/etc/su ...
- 长沙理工大学第十二届ACM大赛-重现赛 B 日历中的数字 (实现)
链接:https://ac.nowcoder.com/acm/contest/1/B来源:牛客网 全屏查看题目 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...
- 小程序makePhoneCall拨打电话问题
调用wx.makePhoneCall后肯定会弹出一个询问框,此时无论是点击确认或者取消,页面都会依次触发app.js中的onHide函数和onShow函数,所以需要注意