python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释
- 模块模式
- 装饰器模式
- 父类重写new继承
单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念.
1. module实现
#模块实现
from Singleton import instance instance <Singleton.Singleton at 0x19cf6691240>
#Singleton.py
class Singleton(object):
pass instance = Singleton()
知识点关联
python导入模块时即将模块运行一遍,可定义__all__变量指定那些变量可以被外部引用
2. 装饰器实现
#decorator装饰器实现
def Singleton(cls):
#instance作为字典变量写在外部,可以保证该装饰器的重用性
_instances = {}
def getinstance(*arg,**kwarg):
if cls not in _instances:
_instances[cls] = cls(*arg,**kwarg)
return _instances[cls]
return getinstance
@Singleton
class A(object):
pass
a = A()
b = A() print(id(a)) #2268820031976
print(id(b)) #2268820031976
a is b True A.__name__ 'getinstance'
从学习过程来看,装饰器学习的要点在于理解at语法等于一次A = Singleton(A).装饰过后A.__name__查看可以发现已经变成getinstance,在装饰器的getinstance之前使用functool.wrap可以解决问题.
3. 父类继承实现
#父类重写__new__
class Singleton(object):
_instance = None
def __new__(cls,*arg,**kwarg):
if not cls._instance:
cls._instance = super(Singleton,cls).__new__(cls, *arg, **kwarg)
return cls._instance
class A(Singleton):
pass
通过这个例子可以了解到父类都可以做些什么,无非是提前定义变量和函数.通过重写__new__函数,改变了A类别创建实例的过程.
推广开来的话,基本上本文的四个例子都是在”改变创建实例的过程”.包括JAVA中实现单例的几种方法也是同个道理.记住了这一点,知识便有了线索,就算下次忘了细节,也能沿着线索重新回忆所学过的内容.
将程序设计的思想应用到学习过程中,从例子中抽象得出原理,可以提高学习效率.
python实现单例模式的三种方式及相关知识解释的更多相关文章
- Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...
- Python格式化输出的三种方式
Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...
- 记住 Python 变量类型的三种方式
title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...
- python 字符串换行的三种方式
if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa bbbbbbbbbbbbbb''' #第二种: 三个 ...
- python实现进程的三种方式及其区别
在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...
- Python—创建进程的三种方式
方式一:os.fork() 子进程是从os.fork得到的值,然后赋值开始执行的.即子进程不执行os.fork,从得到的值开始执行. 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,f ...
- Python输出内容的三种方式:print输出 python脚本执行 linux直接执行
1. 在linux中安装python后,在linux命令行中输入python即可切换到Python命令行下 退出python命令行的命令: 老版本:ctrl+D 新版本:quit();或exit() ...
- python反转列表的三种方式
1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...
- python创建字典的三种方式
创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...
随机推荐
- 实验八 Web基础 SQL注入原理
实验八 Web基础 实验要求 (1)Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2)Web前端javascipt ...
- Python request SSL证书问题
错误信息如下: 1 requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_s ...
- vue开发记录--element-ui的form表单label和placeholder国际化遇到的小问题
<el-form-item label="$t('permission.employeeName')"> <el-input v-model="form ...
- python读取数据库并把数据写入本地文件
一,介绍 上周用jmeter做性能测试时,接口B传入的参数需要依赖接口A生成的借贷申请ID,接口A运行完需要把生成的借贷申请ID导出来到一个文件,作为参数传给接口B,刚开始的时候,手动去数据库倒, 倒 ...
- 如何让外网访问自己的本地Web服务
目前很多网站开发者安装了IIS或者Apache等Web服务器,可以把自己电脑配置成一以路由为中心的内网服务器. 本地服务器在内网测试是绰绰有余的,但是有些项目需要演示给异地的客户验收,而又赶不及把自己 ...
- 汇编-10.0-CALL和RET指令
call和ret指令都是转移指令,他们都是修改IP,或同时修改CS和IP.它们常被共同用来实现子程序设计. 1.ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令 ...
- P3803 【模板】多项式乘法(FFT)
传送门: 参考博客 1:大佬 attack 参考博客 2:大佬 胡小兔 在这里再膜拜一下这两位大佬 Orz%%% #include<iostream> #include<cstd ...
- PrintWriter write返回数据显示中文变问号"???"
在response.getWriter();前加上这些就ok了 response.setContentType("text/html;charset=UTF-8"); respon ...
- PS跑马灯效果和更换图标
最终效果 1.图片修改 跑马灯效果图 Head页面 使用的 IScript_HPDefaultHdr() in WEBLIB_PORTAL.PORTAL_HOMEPAGE 这个页面 一 ...
- .Net与 WebAssembly 随笔
WebAssembly 是啥 - WebAssembly 是一种浏览器支持的字节码格式,WebAssembly 字节码和底层机器码很相似可快速装载运行,因此性能相对于 JS 解释执行大大提升,需要放到 ...