配置文件settings.py

  1. IP='100.0.0.2'
  2. PORT=3302

方式一:绑定给类的方法

  1. class Mysql:
  2. __instance = None
  3.  
  4. def __init__(self, ip, port):
  5. self.ip = ip
  6. self.port = port
  7.  
  8. @classmethod
  9. def from_conf(cls):
  10. if cls.__instance is None:
  11. cls.__instance = cls(settings.IP, settings.PORT)
  12. return cls.__instance
  13.  
  14. obj1 = Mysql.from_conf()
  15. obj2 = Mysql.from_conf()
  16. obj3 = Mysql.from_conf()
  17. obj = Mysql('1.1.1.0', 3302)
  18. print(obj)
  19. print(obj1)
  20. print(obj2)
  21. print(obj3)

方式二:装饰器

  1. def singleton(cls):
  2. # 先造好一个空对象
  3. instance = cls(settings.IP, settings.PORT)
  4.  
  5. def wrapper(*args, **kwargs):
  6. if args or kwargs: # args 和 kwargs 有值时,返回obj
  7. obj = cls(*args, **kwargs)
  8. return obj
  9. return instance
  10.  
  11. return wrapper
  12.  
  13. @singleton
  14. class Mysql: # Mysql = singleton(Mysql)
  15. def __init__(self, ip, port):
  16. self.ip = ip
  17. self.port = port
  18.  
  19. obj1 = Mysql() # wrapper()
  20. obj2 = Mysql()
  21. obj3 = Mysql()
  22. obj4 = Mysql('1.1.1.2', 3303)
  23. print(obj1)
  24. print(obj2)
  25. print(obj3)
  26. print(obj4)

方式三:自定义元类

  1. class Mymeta(type):
  2. def __init__(self, class_name, class_base, class_dic):
  3. # 先造好一个空对象
  4. self.instance = self(settings.IP, settings.PORT)
  5.  
  6. def __call__(self, *args, **kwargs):
  7. if args or kwargs:
  8. # 拿到一个空对象
  9. obj = self.__new__(self)
  10.  
  11. # 执行__init__方法为对象初始化属性
  12. self.__init__(obj, *args, **kwargs)
  13.  
  14. # 返回一个实例化好的对象
  15. return obj
  16. return self.instance
  17.  
  18. class Mysql(metaclass=Mymeta):
  19. def __init__(self, ip, port):
  20. self.ip = ip
  21. self.port = port
  22.  
  23. obj1 = Mysql() # 调用Mysql就是调用__call__方法
  24. obj2 = Mysql()
  25. obj3 = Mysql()
  26. obj4 = Mysql('1.1.1.4', 3301)
  27. print(obj1)
  28. print(obj2)
  29. print(obj3)
  30. print(obj4)

方式四:利用模块的导入特性

  1. import settings
  2.  
  3. class Mysql:
  4. def __init__(self, ip, port):
  5. self.ip = ip
  6. self.port = port
  7.  
  8. instance = Mysql(settings.IP,settings.PORT)

singleton.py

  1. def f1():
  2. from singleton import instance
  3. print(instance)
  4.  
  5. def f2():
  6. from singleton import instance, Mysql
  7. print(instance)
  8. obj = Mysql('1.1.1.0', 3303)
  9. print(obj)
  10.  
  11. f1()
  12. 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. 定时任务调度工作(学习记录 二)timer定时函数的用法

    schedule的四种用法: 1.schedule(task,time) 参数: task----所安排的任务 time----执行任务的时间 作用: 在时间等于或超过time的时候执行且仅执行一次t ...

  2. jsp使用

    session.setAttribute("sessionName",Object); 用来设置session值的,sessionName是名称,object是你要保存的对象. s ...

  3. 20165223《网络对抗技术》Exp5 MSF基础应用

    目录 -- MSF基础应用 实验说明 实验任务内容 基础问题回答 实验内容 主动攻击 ms17_10_eternalblue(成功) ms17_10_psexec(成功) ms08_067_netap ...

  4. 3d

    http://jokerwang.com/diy-3d%E6%89%93%E5%8D%B0%E6%9C%BA1-%E7%A1%AC%E4%BB%B6%E7%AF%87/

  5. 计算指定文件的MD5值

    /// <summary> /// 计算指定文件的MD5值 /// </summary> /// <param name="fileName"> ...

  6. sqlserver建立远程查询

    开始远程查询前: ----open:Ad Hoc Distributed QueriesEXEC sp_configure 'show advanced options',1reconfigureex ...

  7. Apache Hadoop 2.9.2 的集群管理之服役和退役

    Apache Hadoop 2.9.2 的集群管理之服役和退役 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着公司业务的发展,客户量越来越多,产生的日志自然也就越来越大来,可能 ...

  8. TF Multi-GPU single input queue

    多GPU的数据训练,feed images, labels = cifar10.distorted_inputs() split_images = tf.split(images, FLAGS.num ...

  9. google搜索指南

    常用搜索技巧 搜索社交媒体@ @twitter 搜索特定价格$ $400 搜素标签# #tag 排除特定词,在词前加减号- -except 搜索完全匹配词,加双引号"" " ...

  10. VS Less Compiler插件使用

    1.打开扩展管理器,下载安装 2.新建一个test.less文件 3.敲入代码 @grayback: #808080; body { background:@grayback; } 4.保存即可自动生 ...