Python 实现单例模式的一些思考
一、问题: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)
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 实现单例模式的一些思考相关推荐
- python采用单例模式游戏_Python实现Singleton模式的方式详解
前言 使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对 ...
- Python设计模式-单例模式
Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- Python 实现单例模式
Python 实现单例模式 单例模式是一种软件设计模式. 在面向对象编程中,通过单例模式只能创建一个类实例,也就是一个类永远只有一个实例对象. 在工作中,为了确保某一个类只会创建出一个实例,就需要使用 ...
- Python实现单例模式的几种方式
认识单例模式 含义 单例模式是一种常用的软件设计模式,在应用这个模式时,类只会生成一个实例对象. 换句话说,单例模式确保某个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例,当我们在程序中的 ...
- Python 设计模式: 单例模式(singleton pattern)
2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...
- Python创建单例模式的5种方法
单例模式(Singleton Pattern)是一种常用的软件设计模式,是指一个类的实例从始至终只能被创建一次,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例:为了 ...
- python实现单例模式的三种方法
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 其目 ...
- python:单例模式--使用__new__(cls)实现
单例模式:即一个类有且仅有一个实例. 那么通过python怎么实现一个类只能有一个实例呢. class Earth:"""假如你是神,你可以创造地球"" ...
最新文章
- Apriori算法通俗详解_fpgrowth_关联
- android 监控app卸载,Android应用监听自身卸载
- LeetCode实战:两数相加
- java程序重新执行一遍_我怎么在jsp里只执行其中一小段java代码,而不把整个页面都重新加载一遍?...
- 多线程:了解一下ForkJoin、FutureTask、BlockingQueue
- JVM调优:一个对象从出生到消亡过程
- 牛客 - 动物森友会(二分+最大流)
- MVC的传递数据的方法
- 从把事做对到做对的事
- 单词接龙(信息学奥赛一本通-T1220)
- 机器学习基础(二十四)—— Random Forest
- 20个最漂亮的基于WordPress的企业网站
- Java 数据库连接池的实现
- C语言航空订票系统课程设计
- 小车|PID算法 闭环控制 带有 霍尔编码器 的电机
- 云上财务经营的成本管理
- 安装算量软件价格_鹏业安装算量软件正版购买渠道
- MTSP问题遗传算法解决代码及其案例
- 专业家庭影院功放推荐-数字功放芯片
- 院校-美国:麻省理工学院(MIT)
热门文章
- Hadoop-2.4.1学习之Writable及事实上现
- linux gdb基本调试及其多线程调试
- 关于配置文件的节点内容加密(备忘)
- 捕获asp.net下的未处理异常
- Using Delegates with Data Readers to Control DAL Responsibility[转]
- 训练集、验证集、测试集
- window上安装fasttext
- 【文本匹配】cqrctr:文本匹配的破城长矛
- 李航博士:《统计学习方法》第二版上线啦!增加无监督学习!
- pytorch--torch.zeros()怎么使用