python中单例模式的四种实现方式
配置文件settings.py
- IP='100.0.0.2'
- PORT=3302
方式一:绑定给类的方法
- class Mysql:
- __instance = None
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- @classmethod
- def from_conf(cls):
- if cls.__instance is None:
- cls.__instance = cls(settings.IP, settings.PORT)
- return cls.__instance
- obj1 = Mysql.from_conf()
- obj2 = Mysql.from_conf()
- obj3 = Mysql.from_conf()
- obj = Mysql('1.1.1.0', 3302)
- print(obj)
- print(obj1)
- print(obj2)
- print(obj3)
方式二:装饰器
- def singleton(cls):
- # 先造好一个空对象
- instance = cls(settings.IP, settings.PORT)
- def wrapper(*args, **kwargs):
- if args or kwargs: # args 和 kwargs 有值时,返回obj
- obj = cls(*args, **kwargs)
- return obj
- return instance
- return wrapper
- @singleton
- class Mysql: # Mysql = singleton(Mysql)
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- obj1 = Mysql() # wrapper()
- obj2 = Mysql()
- obj3 = Mysql()
- obj4 = Mysql('1.1.1.2', 3303)
- print(obj1)
- print(obj2)
- print(obj3)
- print(obj4)
方式三:自定义元类
- class Mymeta(type):
- def __init__(self, class_name, class_base, class_dic):
- # 先造好一个空对象
- self.instance = self(settings.IP, settings.PORT)
- def __call__(self, *args, **kwargs):
- if args or kwargs:
- # 拿到一个空对象
- obj = self.__new__(self)
- # 执行__init__方法为对象初始化属性
- self.__init__(obj, *args, **kwargs)
- # 返回一个实例化好的对象
- return obj
- return self.instance
- class Mysql(metaclass=Mymeta):
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- obj1 = Mysql() # 调用Mysql就是调用__call__方法
- obj2 = Mysql()
- obj3 = Mysql()
- obj4 = Mysql('1.1.1.4', 3301)
- print(obj1)
- print(obj2)
- print(obj3)
- print(obj4)
方式四:利用模块的导入特性
- import settings
- class Mysql:
- def __init__(self, ip, port):
- self.ip = ip
- self.port = port
- instance = Mysql(settings.IP,settings.PORT)
singleton.py
- def f1():
- from singleton import instance
- print(instance)
- def f2():
- from singleton import instance, Mysql
- print(instance)
- obj = Mysql('1.1.1.0', 3303)
- print(obj)
- f1()
- f2()
python中单例模式的四种实现方式的更多相关文章
- python中字符串的四种表达方式
今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...
- 【温故知新】——原生js中常用的四种循环方式
一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0 网页输出“欢迎下次光临” 在网页中弹出框输入1 网页输出“查询中……” 在 ...
- JAVA中单例模式的几种实现方式
1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
- python中字符串的几种表达方式(用什么方式表示字符串)
说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 ...
- Android中Activity的四种启动方式
谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...
- Spring中bean的四种注入方式
一.前言 最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...
- 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述
读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Robot Framework--接口测试中常见的四种POST方式
写接口测试用例时,遇到以json格式提交数据时,报错,Request如下图: Response如下图: 改成form格式提交,可以正常运行,如下图: 代码如下: ------------------- ...
随机推荐
- 定时任务调度工作(学习记录 二)timer定时函数的用法
schedule的四种用法: 1.schedule(task,time) 参数: task----所安排的任务 time----执行任务的时间 作用: 在时间等于或超过time的时候执行且仅执行一次t ...
- jsp使用
session.setAttribute("sessionName",Object); 用来设置session值的,sessionName是名称,object是你要保存的对象. s ...
- 20165223《网络对抗技术》Exp5 MSF基础应用
目录 -- MSF基础应用 实验说明 实验任务内容 基础问题回答 实验内容 主动攻击 ms17_10_eternalblue(成功) ms17_10_psexec(成功) ms08_067_netap ...
- 3d
http://jokerwang.com/diy-3d%E6%89%93%E5%8D%B0%E6%9C%BA1-%E7%A1%AC%E4%BB%B6%E7%AF%87/
- 计算指定文件的MD5值
/// <summary> /// 计算指定文件的MD5值 /// </summary> /// <param name="fileName"> ...
- sqlserver建立远程查询
开始远程查询前: ----open:Ad Hoc Distributed QueriesEXEC sp_configure 'show advanced options',1reconfigureex ...
- Apache Hadoop 2.9.2 的集群管理之服役和退役
Apache Hadoop 2.9.2 的集群管理之服役和退役 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着公司业务的发展,客户量越来越多,产生的日志自然也就越来越大来,可能 ...
- TF Multi-GPU single input queue
多GPU的数据训练,feed images, labels = cifar10.distorted_inputs() split_images = tf.split(images, FLAGS.num ...
- google搜索指南
常用搜索技巧 搜索社交媒体@ @twitter 搜索特定价格$ $400 搜素标签# #tag 排除特定词,在词前加减号- -except 搜索完全匹配词,加双引号"" " ...
- VS Less Compiler插件使用
1.打开扩展管理器,下载安装 2.新建一个test.less文件 3.敲入代码 @grayback: #808080; body { background:@grayback; } 4.保存即可自动生 ...