配置文件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中单例模式的四种实现方式的更多相关文章

  1. python中字符串的四种表达方式

    今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...

  2. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  3. JAVA中单例模式的几种实现方式

    1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...

  4. python中字符串的几种表达方式(用什么方式表示字符串)

    说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 ...

  5. Android中Activity的四种启动方式

    谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...

  6. Spring中bean的四种注入方式

    一.前言   最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式.这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解 ...

  7. 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述

    读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...

  8. python 单例模式的四种创建方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  9. Robot Framework--接口测试中常见的四种POST方式

    写接口测试用例时,遇到以json格式提交数据时,报错,Request如下图: Response如下图: 改成form格式提交,可以正常运行,如下图: 代码如下: ------------------- ...

随机推荐

  1. 北京2018网络赛A题

    题意:给你一个迷宫,迷宫有开始节点和结束节点,问你从开始走到结束的最小时间,其中,#代表这个点有毒气,身上必须带着氧气瓶才行,B代表每次进入这个点可以带一个氧气瓶,最多身上带五个,P代表进入这个点加速 ...

  2. OpenJudge-bailian 3454 秦腾与教学评估

    http://bailian.openjudge.cn/practice/3454?lang=en_US 题目 在秦腾进入北京大学学习的第一个学期,就不幸遇到了前所未有的教学评估.在教学评估期间,同学 ...

  3. luogu4166 最大土地面积 (旋转卡壳)

    首先这样的点一定在凸包上 然后旋转卡壳就可以 具体来说,枚举对角线的一个端点,另一个端点在凸包上转,剩下两个点就是一个叉积最大一个最小,而这两个点也是跟着转的 所以是$O(N^2)$ #include ...

  4. 熵值法 [异质指标同质化]中-Matlab 数据归一化预处理 mapminmax函数

    一.mapminmax Process matrices by mapping row minimum and maximum values to [-1 1] 意思是将矩阵的每一行处理成[-1,1] ...

  5. 第四十五篇--将文件写入SD卡

    RAM: 运行内存 ROM: 外部存储,手机内部存储 SD卡:外部存储,SD卡存储. 在存储文件时千万不要忘记向清单文件中添加相应权限,并且android6.0以后还要添加运行时权限 还有一个权限有所 ...

  6. Redisson实现分布式锁

    转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...

  7. Spring data jpa 调用存储过程处理返回参数及结果集

    一.环境 1.此随笔内容基于spring boot整合的spring data jpa项目, 2.数据库为mysql 5.7.9版本 二.内容 1. 新建存储过程 pro_query_object B ...

  8. C#调用Java的WebService添加SOAPHeader验证

    C#调用Java的WebService添加SOAPHeader验证(2) 1.问题描述 调用的Java的webservice string Invoke(string func, string req ...

  9. windows10安装docker,运行jhipster-registry

    1.官网下载windows版docker 2.设置bios 3.CMD进入到某个jhipster的工程目录,执行"docker-compose -f src/main/docker/jhip ...

  10. Tensorflow计算正确率、精确率、召回率

    二分类模型的评价指标 https://www.cnblogs.com/xiaoniu-666/p/10511694.html 参考tf的方法 predictions = tf.argmax(predi ...