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实现单例模式的三种方式及相关知识解释的更多相关文章

  1. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

  2. Python格式化输出的三种方式

    Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...

  3. 记住 Python 变量类型的三种方式

    title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...

  4. python 字符串换行的三种方式

    if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa         bbbbbbbbbbbbbb''' #第二种: 三个 ...

  5. python实现进程的三种方式及其区别

    在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...

  6. Python—创建进程的三种方式

    方式一:os.fork() 子进程是从os.fork得到的值,然后赋值开始执行的.即子进程不执行os.fork,从得到的值开始执行. 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,f ...

  7. Python输出内容的三种方式:print输出 python脚本执行 linux直接执行

    1.  在linux中安装python后,在linux命令行中输入python即可切换到Python命令行下 退出python命令行的命令: 老版本:ctrl+D 新版本:quit();或exit() ...

  8. python反转列表的三种方式

    1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...

  9. python创建字典的三种方式

    创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...

随机推荐

  1. Java中的常用集合类型总结

    1.可重复列表(List) LinkedList和ArrayList的区别:http://www.importnew.com/6629.html ArrayList vs. LinkedList vs ...

  2. angularjs知识点

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. SecureCRT连接linux步骤

    SecureCRT连接linux步骤  做个笔记,以免隔段时间后忘了 LINUX系统一般都是用来作服务器使用,而且都是通过命令行来操作,为了操作方便我们都会使用第三方软件来远程操作.CRT就是比较常用 ...

  4. C++ 实验2

    #include <iostream> using namespace std; template<class T> void insertionSort(T a[],int ...

  5. gdb常用的指令

    推荐一篇详细的gdb文章:http://witmax.cn/gdb-usage.html 1. 常用的gdb 命令 编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o ...

  6. windows共享文件夹至centos系统文件夹下

    1. window 共享文件夹 https://jingyan.baidu.com/article/358570f6633ba4ce4624fc48.html 2. 在访问Windows共享资料之前, ...

  7. gitbook build/serve 失败,Error: ENOENT: no such file or directory, stat ...

    我使用的 gitbook 版本 CLI version: 2.3.2 GitBook version: 3.2.3 在使用 gitbook 生成文档时,发现编译偶尔不规律性地出现错误 d:\Mine\ ...

  8. httpappplication 和 httpmodule 的理解(转载,写的很好)

    第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...

  9. linux----------CentOS的一些除了yum安装以外的基本操作命令。

    1.tail -n 5 文件名字    : 查看大型文件的后五行内容      head -n 5 文件名字 : 查看文件的前五行内容   2.ls -lh          可以查看文件大小转换以后 ...

  10. Linux 常用命令,处理端口和Tomcat,mysql

    查看端口占用 1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 kill -9 进程号    强制结束进程 启动 1.使用 ser ...