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) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
随机推荐
- sqlserver 创建 aspstate的方法
找到路径 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 不同版本找不同版本的路径 在命令行执行命令 aspnet_regsql.exe -ssadd -s ...
- k3 cloud中单据体中文本自适应
在单据体中添加多行文本,然后设置本地配置,只读单元格自动换行
- 锋利的jQuery ——jQuery选择器(二)
一.jQuery选择器 1)CSS选择器 CSS选择器有:1>标签选择器 E{CSS规则} 2>ID选择器 #ID{CSS规则} 3>类选择器 E.className{CSS ...
- Date与String互相转换及日期的大小比较
private static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; /** * String转Date * * @param ...
- linux Nginx 的安装
确保安装了 gcc,openssl-devel,pcre-devel,zilb-devel 下载官网:http://nginx.org/ [root@localhost tools]# wget ht ...
- Codeforces 920 反图联通块 线段树质因数暴力
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- C#基础知识之正则表达式
正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 实例 下面的实例匹配了以 'S' 开头的单词: using Syste ...
- java Thread源码分析
一.使用 java 多线程 java多线程其中两种使用方式: 1.继承 Thread 类 2.实现 Runnable 接口 public class ThreadTest { public stati ...
- pycharm不支持svn,是需要svn命令行工具没有安装(for windows)
1. 安装svn命令行工具 Subversion for Windows下载https://sourceforge.net/projects/win32svn/?source=typ_redirect ...
- linux下实现web数据同步的四种方式(性能比较)
实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享2.rsync +inotify实现web数据同步3.rsyn ...