#单例模式:使一个类只产生一个对象。他们的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__创建一个单例模式(单例对象)的更多相关文章

  1. python面向对象学习(七)单例

    目录 1. 单例设计模式 单例设计模式的应用场景 2. __new__ 方法 3. Python 中的单例 只执行一次初始化工作 1. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常 ...

  2. 设计模式(java) 单例模式 单例类

    ·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...

  3. iOS 如何创建单例对象

    一.什么是单例? 说到单例我就想起了我的java啊 ,不禁感叹起我的大学时光,学了4年的java开发,到现在还是放弃了我的java,踏入了iOS的行列. 算了,入正轨,我现在正是铁树银花的青春美少女, ...

  4. iOS:创建单例对象的两种方式

    单例模式:创建单例对象的两种方式 方式一:iOS4版本之前      static SingleClassManager *singleManager = nil;      +(SingleClas ...

  5. Spring IoC 中的(Singleton)单例对象创建过程探索

    前言 之前将spring framework 源码导入了idea,后来折腾调试了一下,于是研究了一下最简单的singleton对象在spring中是如何创建的.这里所谓的简单,就是指无属性注入,无复杂 ...

  6. iOS创建安全的单例

    创建安全的单例 #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; ...

  7. 不允许在单例对象中创建Srping容器

    spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”

  8. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  9. 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5)    博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...

随机推荐

  1. Scrapy 教程(九)-日志系统

    最新版本的 scrapy 已经废弃了 scrapy.log 的使用,赞成显示调用python标准日志记录. Python 内建日志系统 import logging ### python 内建 log ...

  2. 基于gulp的前端自动化方案

    前言 ​ 最近几年前端技术发展日新月异,特别是单页应用的普及.组件化.工程化.自动化成了前端发展的趋势.webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好 ...

  3. W3C标准下的盒模型与IE盒模型

    标准盒模型如下图所示: IE下盒模型如下图所示:

  4. time和datetime的区别

    time在 Python 文档里,time是归类在Generic Operating System Services中,换句话说, 它提供的功能是更加接近于操作系统层面的.通读文档可知,time 模块 ...

  5. C++ md5类,封装好

    在网上看到很多md5类,不过封好的很少,我就在网上看到一篇把他写的封装 头文件 #ifndef _MD5_H #define _MD5_H #pragma warning(disable:4786)/ ...

  6. FPGA 物理时序不合理的体现(体现方式:数字钟的行扫描和列扫描)

    本人在这只讨论建模好的模块来比较解释现象,如有不周到请大家指正. 软件功能仿真和在硬件上的区别:可以从这个数码管的行扫描和列扫描实例来体会一下,物理时序的影响和改进方法. 数码管的行扫描.列扫描要求同 ...

  7. python打包命令

    打包成exe方法 (1)切换到该文件夹 (2)pyinstaller -F py文件 (py文件要英文才行) -F 生成单个可执行文件 -w 去掉控制台窗口 -p 自定义需要加载的类路径 -i 可执行 ...

  8. Linux文件的操作及授权

    需求1:新建除了root之外的新用户,并且新用户具有root用户的相关功能 1.首先修改/etc/sudoers文件具有写入的权限 chmod 777 /etc/sudoers 2.修改/etc/su ...

  9. 长沙理工大学第十二届ACM大赛-重现赛 B 日历中的数字 (实现)

    链接:https://ac.nowcoder.com/acm/contest/1/B来源:牛客网 全屏查看题目   时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...

  10. 小程序makePhoneCall拨打电话问题

    调用wx.makePhoneCall后肯定会弹出一个询问框,此时无论是点击确认或者取消,页面都会依次触发app.js中的onHide函数和onShow函数,所以需要注意