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

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

  • 模块模式
  • 装饰器模式
  • 父类重写new继承

单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念.

1. module实现

#模块实现
from Singleton import instanceinstance

<Singleton.Singleton at 0x19cf6691240>
#Singleton.py
class Singleton(object):
passinstance = 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

1 a is b
2 
3 True
4 
5 A.__name__
6 
7 'getinstance'

从学习过程来看,装饰器学习的要点在于理解at语法等于一次A = Singleton(A).装饰过后A.__name__查看可以发现已经变成getinstance,在装饰器的getinstance之前使用functool.wrap可以解决问题.  

3. 父类继承实现

#父类重写__new__
class Singleton(object):_instance = Nonedef __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中实现单例的几种方法也是同个道理.记住了这一点,知识便有了线索,就算下次忘了细节,也能沿着线索重新回忆所学过的内容.
将程序设计的思想应用到学习过程中,从例子中抽象得出原理,可以提高学习效率.

转载于:https://www.cnblogs.com/daijingkun/p/10752669.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统复习】系统调用

系统调用一、什么是系统调用&#xff1f;二、系统调用与库函数的区别三、系统调用背后的过程一、什么是系统调用&#xff1f; &#x1f481; 系统调用&#xff1a; 是操作系统提供给应用程序&#xff08;程序员/编程人员&#xff09;使用的接口&#xff0c;可以理解为一种可供…

计算机视觉——openCV的简介

\qquadopenCV是一个开源的计算机视觉库&#xff0c;英特尔于1999年开发出来&#xff0c;首先用C/C编写。使用pip install opencv-python安装OpenCV库&#xff0c;在python中&#xff0c;直接使用import cv2命令&#xff0c;导入OpenCV库。 1.openCV的颜色模式 \qquadopenCV的默…

北大校友“炼丹”分享:OpenAI如何训练千亿级模型?

来源&#xff1a;AI科技评论编译&#xff1a;琰琰大规模深度神经网络训练仍是一项艰巨的挑战&#xff0c;因为动辄百亿、千亿参数量的语言模型&#xff0c;需要更多的 GPU 内存和时间周期。这篇文章从如何多GPU训练大模型的角度&#xff0c;回顾了现有的并行训练范式&#xff0…

WeStrom自定义设置修改快捷键

按照下图操作&#xff0c;不BB&#xff1a; 终极懒人设置&#xff1a;&#xff01;&#xff01;&#xff01; 转载于:https://www.cnblogs.com/luzhanshi/p/10755285.html

计算机视觉——图像预处理及边缘检测

1.为什么要进行图像预处理&#xff1f; \qquad当对图像进行边缘、轮廓的检测时&#xff0c;图像噪声会对检测产生不利影响&#xff0c;并且为了帮助模型专注于一般细节并获得更高的准确度&#xff0c;我们需要对图像进行预处理。 \qquad预处理的内容有去除噪声&#xff0c;控制…

【操作系统复习】进程的状态与转换

进程的状态与转换一、进程的状态二、进程的转换一、进程的状态 进程是程序的一次执行过程。在这个执行过从中&#xff0c;有时进程正在被CPU处理&#xff0c;有时又需要等待CPU服务&#xff0c;可见 &#xff0c;进程的状态是会有各种变化。为了方便对各个进程的管理&#xff…

图灵奖得主杨立昆人工智能十问:AI会统治人类吗?

来源&#xff1a;《科学之路》作者&#xff1a;杨立昆 即便是最先进的人工智能系统也存在局限性&#xff0c;它们还不如一只猫聪明。人工智能常常被认为是一项将要颠覆世界的技术&#xff0c;从这一概念诞生至今的65年中&#xff0c;无数电影与小说塑造了各种经典的人工智能角…

数据产品-数据库

code-n转载于:https://www.cnblogs.com/codewan/p/10755374.html

linux的常用操作——lftp、nfs、ssh和scp

1 lftp的介绍 1.1 lftp的作用 \qquad一个ftp客户端工具&#xff0c;可以上传或者下载文件。 1.2 lftp的安装 \qquadUbuntu下:sudo apt-get install lftp \qquadcentos下&#xff1a;sudo yum install lftp 1.3 使用lftp登录服务器 \qquad匿名登录&#xff1a;lftp IP地址 \q…

【操作系统复习】进程控制

进程控制一、原语1.1 进程控制相关的原语1.1.1 进程的创建1.1.2 进程的终止1.1.3 进程的阻塞和唤醒1.1.4 进程的切换&#x1f481; ​进程控制的主要功能是对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。一、原语 用…

mybatis postgresql insert后返回自增id

在使用mybatis postgresql&#xff0c;我们有时在插入数据时需要返回自增id的值&#xff0c;此时在插入时&#xff0c;可以按照以下例子来编写mapper文件 <insert id"insertUser"><selectKey resultType"int" order"AFTER" keyProper…

DeepMind 的新强化学习系统是迈向通用 AI 的一步吗?

来源&#xff1a;数据实战派作者&#xff1a;Ben Dickson这篇文章是我们对 AI 研究论文评论的一部分&#xff0c;这是一系列探索人工智能最新发现的文章。对于已经精通围棋、星际争霸 2 和其他游戏的深度强化学习模型来说&#xff0c;人工智能系统的主要挑战之一是它们无法将其…

linux的常用操作——vim和vi

1.vi和vim有什么区别&#xff1f; \qquadvi和vim都是文本编辑器&#xff0c;vim是从vi发展过来的。 2.vim的三种操作模式 &#xff08;1&#xff09;命令模式&#xff1a; \qquad打开文件之后&#xff0c;默认进入命令模式。 vim a.txt #打开a.txt文本&#xff0c;此时处于命…

第十届蓝桥杯 等差数列(Python)

题目&#xff1a; 思路&#xff1a; 1、给数组排序&#xff0c;求出两两之间的差值即公差&#xff0c;如果差值为0&#xff0c;直接返回n&#xff0c;否则进入第二步&#xff1b; 2、给差值数组排序&#xff0c;求出两两之间的最大公因数即公差 代码&#xff1a; def gcd(…

两种实现简单cp的方法

第一种&#xff1a;标准IO #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define N 32 void mycp(const char * sour,const char * des); int main(int argc, const char *argv[])…

linux的常用操作——gcc

1.什么是gcc \qquadgcc是linux中的一款编译源代码的文本编译器 2.编译过程 \qquad比如对hello.c文件进行编译&#xff0c; \qquad首先&#xff0c;预处理器cpp对hello.c进行处理&#xff0c;cpp会把头文件展开&#xff0c;宏替换&#xff0c;注释去掉&#xff0c;经过cpp处理后…

LeetCode 678. 有效的括号字符串

传送门&#xff1a;https://leetcode-cn.com/problems/valid-parenthesis-string 题目描述&#xff1a; 给定一个只包含三种字符的字符串&#xff1a;&#xff08; &#xff0c;&#xff09; 和 *&#xff0c;写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下…

汪卫华院士:无序中找有序 复杂中寻规律

来源&#xff1a;中国科学报原文出处&#xff1a;《中国科学报》 (2021-10-11 第4版 综合)作者&#xff1a;汪卫华&#xff08;作者系中国科学院院士、松山湖材料实验室主任&#xff09;冰河时代为什么会周期性重复出现&#xff1f;是否有关于混沌和湍流系统更一般的数学描述&a…

霍金 | 哥德尔和物理学的终结

来源&#xff1a;爱思想转自&#xff1a;人机与认知实验室 作者&#xff1a;史蒂芬霍金 英国剑桥大学著名物理学家&#xff0c;现代最伟大的物理学家之一译者&#xff1a;凌高【感谢陈禹老师&#xff1a;"冯诺依曼说过&#xff0c;没有明确的概念&#xff0c;量得分析是毫…

BUAA_OO_第二单元作业总结

程序设计策略 第一次作业 第一次作业实现的是FAFS式傻瓜调度电梯&#xff0c;由于是第一次接触多线程&#xff0c;难度不是很大。在我的设计里&#xff0c;我借鉴了生产者消费者模式&#xff0c;设计了一个输入线程和一个电梯线程&#xff0c;控制器的设计使用了单例模式&#…