单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样。

如下:

源码:

class A(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '__inst'):print('执行new')obj = super(A, cls).__new__(cls)setattr(cls, '__inst', obj)return objelse:return cls.__dict__['__inst']def __init__(self, x):print('执行init')self.x = xif __name__ == '__main__':a1 = A(1)print('a1.x ', a1.x)a2 = A(2)print('a2.x ', a2.x)print('a1.x ', a1.x)a3 = A.__new__(A)# a3.__init__(3)                    # a3 = A(3) 实际是调用了new和init方法,此处屏蔽调用initprint('a3.x ', a3.x)print(id(a1), id(a2), id(a3))

实例化了三个对象,执行结果可以猜猜:

可以发现,执行了一次new,但执行了两次init,这是在新式类下运行的,python3默认是新式类,不管有没有继承object。

如果是python2,且不继承object,实际上是只会打印执行一次init。所以这是py2和py3的又一个区别,经典类和新式类区别非常多,新式类的反射方法也与经典类有些不同。但一般文章只说新式类和经典类的区别只是广度优先和深度优先,误导。

3、终极目标就是使python3的实例也不多执行力一次init,(因为虽然单例模式能控制成是所有类的实例指向同一个对象,但有时候的单例模式初始化是建立一个io连接或者资源池,这样每次执行初始化浪费一些时间)

三种方法,一种是增加一个类属性做标志,在init方法中增加if判断

第二种是,不使用 a = A(xxxx),而使用a = A.__new__(A),因为a = A(xxxx),实际上是a = A.__new__(A),和a.__init__(xxx)

第三种是自己写一个名字例如叫  _custom_init的方法,不写__init__方法,在new中生成self(就是实例),new里面显式手动调用此方法,这样也可以避免自动执行__init__

4、还有一种方式是使用装饰器,如果按照这个写法也不会执行多次init

单例模式装饰器

#coding=utf8
from functools import wrapsdef singleton(cls):print clsinstances = {}@wraps(cls)def getinstance(*args, **kw):if cls not in instances:instances[cls] = cls(*args, **kw)return instances[cls]return getinstance@singleton
class MyClass(object):a = 1m1=MyClass()
m2=MyClass()print m1 is m2

或者元类单例模式,

单例模式元类

5、在实际项目中我用的单例模式有一些,不是很多,享元模式就可以了,享元模式是对一个重点属性在不同对象中保证该属性是指向同一个对象,使用更为灵活,这个重点属性通常是一个io连接或资源池,或者计算代价十分大的东西,以免造成实例化浪费巨大的时间。

python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。...相关推荐

  1. python新式类和经典类区别_Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  2. 新式类和经典类的区别类的特殊方法单例模式

    目录: 新式类和经典类的区别 重写特殊的构造方法 类的特殊方法 单例模式原理及作用 新式类和经典类的区别: 1)首先,写法不一样: class A: #经典类写法passclass B(object) ...

  3. python经典类新式类_Python的新式类和经典类

    1. 前言 python在2.2版本中引入了descriptor功能,也正是基于这个功能实现了新式类(new-styel class)的对象模型, 同时解决了之前版本中经典类(classic clas ...

  4. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  5. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  6. python新式类和经典类的区别?

    在python里凡是继承了object的类,都是新式类. Python2里面继承object的是新式类,没有写父类的是经典类. Python3里只有新式类. 经典类目前在Python里基本没有应用,多 ...

  7. Python 新式类与经典类

    新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查 ...

  8. python中新式类和经典类的区别

    1.新式类和经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...

  9. python新式类和经典类的区别

    python新式类和经典类的区别 1,新式类和经典类的区别: 广度优先和深度优先,这主要是在多类继承的时候会使用到,如下多类继承的D类对比: 经典类在加载的时候采用的是深度优先算法,二新式类采用的是广 ...

最新文章

  1. python学了有什么用处-python教程有什用《学习python有什么好的用处》
  2. pac代理模式什么意思_满镒财务:代理记账所说的“核税”是什么意思?
  3. 全网最细笔记java与kotlin的一些异同
  4. Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
  5. 前标识(NT AUTHORITY\NETWORK SERVICE)没有对 (转)
  6. 在Asp.Net Core MVC 开发过程中遇到的问题总结
  7. React基础篇(二)之点击button修改属性值
  8. C# BackgroudWorker
  9. eclipse护眼颜色和字体大小设置
  10. 三分钟让面试官满意系列 - Bagging和Boosting 的联系及区别
  11. java 从已知日期计算干支纪日_两个日期计算
  12. 安卓拍照上传php服务器,Android拍照上传至PHP服务器并写入MySql数据库(下)
  13. 7 分钟了解 eBay Flink 服务的端到端管理
  14. Atiitt 管理方面的误区总结 attilax总结
  15. javascript实现计算器
  16. 商用密码产品认证-安全电子门禁系统
  17. 曲面映射的算法理论基础
  18. android 蓝牙打印乱码,蓝牙打印机打印中文乱码
  19. 不会做PPT图表?1000个高大上的PPT图表,0门槛0套路,想要就给你
  20. KendoGrid的使用

热门文章

  1. kruskal算法_大厂面试为什么总是考算法?
  2. CCP/XCP和T-BOX知识点
  3. oracle 数据泵_如何提升数据泵导出效率?
  4. 化工计算机软件基础考试题,2013年化工工程师基础知识网友版真题(下午卷)...
  5. android 8.0 edittext,关注TextInputEditText的Android 8.0 Oreo崩溃
  6. php 集字抽奖,php字符集转换
  7. 荣耀平板5升级鸿蒙,荣耀能否“升级”鸿蒙?赵明正式确认:华为做得好会考虑采用!...
  8. 安卓音频输出采样率_如何调好OBS Studio的音频设置 进阶篇
  9. java 正则表达式 Pattern
  10. Language modeling tutorial in torchtext