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格式提交,可以正常运行,如下图: 代码如下: ------------------- ...
随机推荐
- Windows平台安装TensorFlow Q&A
·本文讲的是Windows平台使用原生pip进行TensorFlow(CPU版本)安装的注意事项及常见问题解决方法 ·这是TensorFlow官网的安装介绍:在 Windows 上安装 TensorF ...
- OO_第二单元总结
第二次总结博客(电梯单元) 16071070 陈泽寅 2019.4.20 一:多线程实验初感 这个单元是多线程设计的实践单元,主要让我们运用多线程的原理与思想去完成一个模拟电梯运行的策略.从最开始的单 ...
- CentOS7桌面版系统使用的一些小技巧
1. 清空~/.kde/ 文件下的文件,登陆后不显示桌面的解决方法 在使用CentOS7 桌面系统时,有时候打开文件会很卡.这时我们需要清空当前用户下的 .kde 文件下的所有文件. 再重新登陆该用户 ...
- LODOP打印用JS获取的当前日期
该文详细一步步解释JS获取当前时间的方法,新手小白也看到懂,最后是实际的获取当前年月份的方法.JS中的Date()对象,包含很多当前系统时间的方法,首先建立一个Date()对象,这里取名为date,然 ...
- Adding appsettings.json to a .NET Core console app
This is something that strangely doesn’t seem to be that well documented and took me a while to figu ...
- 一道php笔试题
原文地址: http://www.walu.cc/php/a-bishiti.md 问题: 请找出下面代码中的问题,修复并优化. <?php //批量注册用户,每次>100个. //注册新 ...
- 文本编辑利器Notepad++ 10个强大而又鲜为人知的特性【转】
文本编辑利器Notepad++ 10个强大而又鲜为人知的特性 - 为程序员服务
- LUYA-CDM
下载链接:https://pan.baidu.com/s/11Lq3IWcAcAs9gYbq4mYm1Q 密码:n1kz
- 简易RPC
暴露服务: package com.saiarea; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; impo ...
- BUG-‘Tokenizer’ object has no attribute ‘oov_token’
使用keras包实现NLP问题时,报错 /lib/python3./dist-packages/keras/preprocessing/text.py”, line , in texts_to_seq ...