一、classmethod装饰器

# 全局变量
ip = '192.168.13.98'
port = '3306'
class MySQL:__instance = Nonedef __init__(self, ip, port):self.ip = ipself.port = port@classmethoddef instance(cls, *args, **kwargs):if args or kwargs:cls.__instance = cls(*args, **kwargs)return cls.__instanceobj1 = MySQL.instance(ip, port)
obj2 = MySQL.instance()
obj3 = MySQL.instance()
print(obj1)
print(obj2, obj2.__dict__)
print(obj3, obj3.__dict__)

  

输出结果

<main.MySQL object at 0x058D6F30>
<main.MySQL object at 0x058D6F30> {'ip': '192.168.13.98', 'port': '3306'}
<main.MySQL object at 0x058D6F30> {'ip': '192.168.13.98', 'port': '3306'}

  

二、类的装饰器

def singlegon(cls):_instance = cls(ip, port)def wrapper(*args, **kwargs):if args or kwargs:return cls(*args, **kwargs)return _instancereturn wrapper@singlegon
class MySQL1:def __init__(self, ip, port):self.ip = ipself.port = portobj1 = MySQL1()
obj2 = MySQL1()
obj3 = MySQL1('1.1.1.3', 8080)
print(obj1)
print(obj2, obj2.__dict__)
print(obj3, obj3.__dict__)

  

运行结果

<main.MySQL1 object at 0x04C102B0>
<main.MySQL1 object at 0x04C102B0> {'ip': '192.168.13.98', 'port': '3306'}
<main.MySQL1 object at 0x04C10310> {'ip': '1.1.1.3', 'port': 8080}

  

三、元类

class Mymetaclass(type):def __init__(self, class_name, class_bases, class_dic):super().__init__(class_name, class_bases, class_dic)self.__instance = self(ip, port)def __call__(self, *args, **kwargs):if args or kwargs:obj = self.__new__(self)self.__init__(obj, *args, **kwargs)self.__instance = objreturn self.__instanceclass MySQL2(metaclass=Mymetaclass):def __init__(self, ip, port):self.ip = ipself.port = portobj1 = MySQL2()
obj2 = MySQL2()
obj3 = MySQL2('1.1.1.3', 80)
print(obj1)
print(obj2, obj2.__dict__)
print(obj3, obj3.__dict__)

  

运行结果

<main.MySQL2 object at 0x04D003B0>
<main.MySQL2 object at 0x04D003B0> {'ip': '192.168.13.98', 'port': '3306'}
<main.MySQL2 object at 0x04D003D0> {'ip': '1.1.1.3', 'port': 80}

  

四、模块导入

# instance.pyclass MySQL:def __init__(self, ip, port):self.ip = ipself.port = portip = '192.168.13.98'
port = 3306
instance = MySQL(ip, port)# 测试代码
import os, syssys.path.append(os.path.dirname(os.path.dirname(__file__)))
from test import instanceobj1 = instance.instance
obj2 = instance.instance
obj3 = instance.MySQL('1.1.1.3', 80)
print(obj1)
print(obj2, obj2.__dict__)
print(obj3, obj3.__dict__)

运行结果

<day30.instance.MySQL object at 0x052B0AB0>
<day30.instance.MySQL object at 0x052B0AB0> {'ip': '192.168.13.98', 'port': 3306}
<day30.instance.MySQL object at 0x052B03F0> {'ip': '1.1.1.3', 'port': 80}

五、重写__new__()

class MySQL3(object):__instance = None__first_init = Truedef __init__(self, ip, port):if self.__first_init:self.ip = ipself.port = portself.__first_init = Falsedef __new__(cls, *args, **kwargs):if not cls.__instance:cls.__instance = object.__new__(cls)return cls.__instanceobj1 = MySQL3(ip, port)
obj2 = MySQL3(ip, port)
obj3 = MySQL3('1.1.1.3', 80)
print(obj1)
print(obj2, obj2.__dict__)
print(obj3, obj3.__dict__)

  

运行结果

<main.MySQL3 object at 0x059603F0>
<main.MySQL3 object at 0x059603F0> {'ip': '192.168.13.98', 'port': '3306', '_MySQL3__first_init': False}
<main.MySQL3 object at 0x059603F0> {'ip': '192.168.13.98', 'port': '3306', '_MySQL3__first_init': False}

  

:前四种可以实现单例模式,但都不是绝对单例模式,可以创建新的对象,但是第五种方式是绝对单例模式,全局只能真正创建一次对象

转载于:https://www.cnblogs.com/wuliwawa/p/9655670.html

Python 单例模式实现的五种方式相关推荐

  1. 下列哪个不是目前python里的内置模块-python引入模块的五种方式与内置模块

    模块导入的五种方式 1.import 模块名 2.from 模块名 import 方法名 3.from 模块名 import * 4.import 模块名 as 别名 5.from 模块名 impor ...

  2. python引入模块的五种方式与内置模块

    模块 自定义模块 模块的定义与分类 模块的定义 简而言之,模块就是一些常用功能的集合,我们把一些常用的函数.变量或者方法写到一个python文件中,那么这个python文件就是模块,使用模块可以避免我 ...

  3. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  4. 五种方式让你在java中读取properties文件内容不再是难题

    2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 < ...

  5. java 给对象创建实例_Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  6. python list方法说明_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

  7. python list find函数_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

  8. 当前京东数据平台用到spark 的五种方式

    当前京东数据平台用到spark 的五种方式 1.spark sql 数据从Hive 同步到ES   用python包装命令, 使用spark-submit 提交 ,run_shell_cmd(spar ...

  9. android如何绑定事件,Android_安卓为按钮控件绑定事件的五种方式

    一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...

  10. Python格式化字符串的4种方式

    文章目录 Python格式化字符串的4种方式 一:%号 二:str.format 三:f-Strings 四:标准库模板 五:总结四种方式的应用场景 Python格式化字符串的4种方式 一:%号 %号 ...

最新文章

  1. spring_bean三种装配方式
  2. Vs2008 开发Wap 网站
  3. 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
  4. 初一模拟赛总结(2019.6.15)
  5. 【渝粤题库】广东开放大学 文化产业经济学 形成性考核
  6. websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)
  7. Bootstrap 幻灯片效果
  8. 360全景倒车影像怎么看_别克关怀-后视镜和倒车影像 倒车时到底看哪个
  9. 13 - java包装类
  10. [转] Android系统如何实现UI的自适应
  11. MySQL高可用实现:主从结构下ProxySQL中的读写分离
  12. 案例:按照JSP Model2思想实现用户注册功能
  13. 在JSP中应用JavaBean
  14. 定时执行sql统计数据库连接数并记录到表中
  15. archlinux安装mysql_在Arch Linux中安装MySQL
  16. 机器学习基础知识(一):机器学习三大流派
  17. c语言页面置换算法报告,C语言实现页面置换算法
  18. 微服务整合J2cache并改造使用
  19. js对加法计算、减法计算、乘法计算、除法计算的精度处理
  20. 西安电子科技大学-概率论与数理统计大作业-概率论与数理统计在日常生活和社会经济中的应用

热门文章

  1. scrapy Pipline保存到数据库
  2. 计算机网络研修培训总结,计算机培训工作总结(共10篇).doc
  3. 四种模式、五大架构 规划企业物联网蓝图
  4. 【CVE-2016-10009】OpenSSH 7.4 - agent Protocol Arbitrary Library Loading
  5. 分析数据包(Microsoft Visual Studio 2010)
  6. Hadoop MapReduce篇
  7. 小A是支枪,子弹未打光---之手 枪篇
  8. IP地址专题六:计算相关地址
  9. 2月14 大数据处理的基本算法
  10. pytorch可视化