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 ...
随机推荐
- USACO1.4 1.5 搜索剪枝与数字 洛谷OJ P1214 P1215 P1217 P1218
USACO1.4 题解 Arithmetic Progressions 题意 让你求长为n的由小于2*m*m的双平方数组成的等差数列有几个 双平方数:形如 B=P*P+Q*Q,p,q>0的数 题 ...
- webpack 知识点
安装 webpack npm install -g webpack npm install -g webpack-cli@2.x 初始化项目 npm init -y npm install --sav ...
- [Day17]常用API(System、Math、Arrays、BigInteger、BigDecimal)
1.基本类型包装类 1.1 8种基本类型对应的包装类 字节型 byte Byte 短整型 short Short 整型 int Integer 长整型 long Long 字符型 char Chara ...
- JAVA RPC (七) 手把手从零教你写一个生产级RPC之client请求
上节说了关于通用请求代理,实际上对spring的bean引用都是通过koalasClientProxy来实现的,那么在代理方法中才是我们实际的发送逻辑,咱们先看一下原生的thrift请求是什么样的. ...
- poj1915
#include<iostream> using namespace std; #define SIZE 305 int vis[SIZE][SIZE]; int sx,sy,ex,ey; ...
- python中字符串的拼接
1.+ 号 2.format() 3.f"{username}登录成功" 4.%s 5.列表中的 join 6.逗号 http://www.cnblogs.com/gengcx/p ...
- 彻底清空SharePoint回收站(仅限IE)
1.导航到回收站页面2.F12,在控制台输入javascript:emptyItems()3.回车 4.点击确定即可 注意:这种方法可能只适用于Internet Explorer
- ==还款-代偿(csv循环自动代偿)
问题: 解决:传递参数错误,上一步就错了 问题:代偿返回这些信息 解决:传递参数错误,应该为${repayWay1},但是一直写的是${repayWay} 问题:如何从csv文件中逐条取项目编号,进行 ...
- pwn学习日记Day2 基础知识积累
知识杂项 shell-storm.org的shellcode数据库 使用pwntools库把shellcode作为输入传递给程序,尝试使用io.interactive()与程序进行交互,发现可以执行s ...
- Windows使用tail命令跟踪日志
我们知道如果是Unix/Linux环境可以直接使用 tail -f xxx.log即可. 但是Windows并没有自带这个命令,不过从网上可以找到tail.zip 实测可以将其解压放在C:\Windo ...