一、问题:Python中如何实现单例模式

  单例模式指一个类只能实例化一个对象。

二、解决方案:

  所有资料参考于:

http://python.jobbole.com/87294/

https://www.jianshu.com/p/f63ad9d550f1

https://www.cnblogs.com/tkqasn/p/6524879.html

  1. 模块

  永远只有一次,这让我下意识想到Python 的模块,因为学习的时候就知道,多次模块导入是无效的,都相当于导入一次,因为模块的导入十分消耗资源,若是重复导入那么太低效了。

  因此可以利用 导入模块中的实例来实现这一目标。

  

#singleton.py
class SingleTon:def demo(self):print('hello world')
singleton = SingleTon()#test.py
from singleton import singleton
singleton.demo()

  2. __new__方法

  这里涉及到类实例化过程,我想,要想做到永远实例化一个对象,换句话说只要这个类实例化后就不再实例化,那么我们必须在Python原有实例化过程中“做点手脚”

  那必要的就得现搞清楚实例化的具体过程。

  首先:Foo类的类型是type,Foo 类 也是一个对象,实例化加括号即调用 __call__方法,而type 就是 Python 内置的元类,通过type类生成Foo类,

  

class Foo:def __init__(self):print('hello world')
item = Foo()
print(type(Foo),type(item))
#<class 'type'> <class '__main__.Foo'>

  然后

  • Foo(*args, **kwargs)等价于Foo.__call__(*args, **kwargs)
  • 既然Foo是一个type的实例,Foo.__call__(*args, **kwargs)实际调用的是type.__call__(Foo, *args, **kwargs)
  • type.__call__(Foo, *args, **kwargs)调用type.__new__(Foo, *args, **kwargs),然后返回一个对象。
  • obj随后通过调用obj.__init__(*args, **kwargs)被初始化。
  • obj被返回。

可见,__new__() 方法是创建对象,__init__() 是初始化,若要解决我们的问题,应该在 前者下功夫,

class Foo:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls,*args,**kwargs)return cls._instanceitem = Foo()
item1 = Foo()
print(item is item1)

  3. 装饰器

  使用装饰器应该也很方便,

from functools import wrapsdef singleton(cls):instances = {}@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 = 1

  wraps 函数 可以保证传入的类的属性不变,

  4. 元类(metaclass)

str是用来创建字符串对象的类,而int是用来创建整数对象的类,type 是type就是创建类对象的类,元类在API的定义中会有很大用处,具体内容在https://www.cnblogs.com/tkqasn/p/6524879.html讲得很清楚
Django的ORM 就是大量使用元类,有空研究一下。
class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)return cls._instances[cls]# Python2
class MyClass(object):__metaclass__ = Singleton# Python3
class MyClass(metaclass=Singleton):pass

三、挖坑

相关知识点:元类的使用以后研究

转载于:https://www.cnblogs.com/xinghuaikang/p/8489217.html

Python 实现单例模式的一些思考相关推荐

  1. python采用单例模式游戏_Python实现Singleton模式的方式详解

    前言 使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对 ...

  2. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  3. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

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

  4. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  5. Python 实现单例模式

    Python 实现单例模式 单例模式是一种软件设计模式. 在面向对象编程中,通过单例模式只能创建一个类实例,也就是一个类永远只有一个实例对象. 在工作中,为了确保某一个类只会创建出一个实例,就需要使用 ...

  6. Python实现单例模式的几种方式

    认识单例模式 含义 单例模式是一种常用的软件设计模式,在应用这个模式时,类只会生成一个实例对象. 换句话说,单例模式确保某个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例,当我们在程序中的 ...

  7. Python 设计模式: 单例模式(singleton pattern)

    2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...

  8. Python创建单例模式的5种方法

    单例模式(Singleton Pattern)是一种常用的软件设计模式,是指一个类的实例从始至终只能被创建一次,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例:为了 ...

  9. python实现单例模式的三种方法

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

  10. python:单例模式--使用__new__(cls)实现

    单例模式:即一个类有且仅有一个实例. 那么通过python怎么实现一个类只能有一个实例呢. class Earth:"""假如你是神,你可以创造地球"" ...

最新文章

  1. Apriori算法通俗详解_fpgrowth_关联
  2. android 监控app卸载,Android应用监听自身卸载
  3. LeetCode实战:两数相加
  4. java程序重新执行一遍_我怎么在jsp里只执行其中一小段java代码,而不把整个页面都重新加载一遍?...
  5. 多线程:了解一下ForkJoin、FutureTask、BlockingQueue
  6. JVM调优:一个对象从出生到消亡过程
  7. 牛客 - 动物森友会(二分+最大流)
  8. MVC的传递数据的方法
  9. 从把事做对到做对的事
  10. 单词接龙(信息学奥赛一本通-T1220)
  11. 机器学习基础(二十四)—— Random Forest
  12. 20个最漂亮的基于WordPress的企业网站
  13. Java 数据库连接池的实现
  14. C语言航空订票系统课程设计
  15. 小车|PID算法 闭环控制 带有 霍尔编码器 的电机
  16. 云上财务经营的成本管理
  17. 安装算量软件价格_鹏业安装算量软件正版购买渠道
  18. MTSP问题遗传算法解决代码及其案例
  19. 专业家庭影院功放推荐-数字功放芯片
  20. 院校-美国:麻省理工学院(MIT)

热门文章

  1. Hadoop-2.4.1学习之Writable及事实上现
  2. linux gdb基本调试及其多线程调试
  3. 关于配置文件的节点内容加密(备忘)
  4. 捕获asp.net下的未处理异常
  5. Using Delegates with Data Readers to Control DAL Responsibility[转]
  6. 训练集、验证集、测试集
  7. window上安装fasttext
  8. 【文本匹配】cqrctr:文本匹配的破城长矛
  9. 李航博士:《统计学习方法》第二版上线啦!增加无监督学习!
  10. pytorch--torch.zeros()怎么使用