Python 单例模式实现的五种方式
一、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 单例模式实现的五种方式相关推荐
- 下列哪个不是目前python里的内置模块-python引入模块的五种方式与内置模块
模块导入的五种方式 1.import 模块名 2.from 模块名 import 方法名 3.from 模块名 import * 4.import 模块名 as 别名 5.from 模块名 impor ...
- python引入模块的五种方式与内置模块
模块 自定义模块 模块的定义与分类 模块的定义 简而言之,模块就是一些常用功能的集合,我们把一些常用的函数.变量或者方法写到一个python文件中,那么这个python文件就是模块,使用模块可以避免我 ...
- Github项目解析(九)--实现Activity跳转动画的五种方式
2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...
- 五种方式让你在java中读取properties文件内容不再是难题
2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 < ...
- java 给对象创建实例_Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...
- python list方法说明_对python中list的五种查找方法说明
Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...
- python list find函数_对python中list的五种查找方法说明
Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...
- 当前京东数据平台用到spark 的五种方式
当前京东数据平台用到spark 的五种方式 1.spark sql 数据从Hive 同步到ES 用python包装命令, 使用spark-submit 提交 ,run_shell_cmd(spar ...
- android如何绑定事件,Android_安卓为按钮控件绑定事件的五种方式
一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...
- Python格式化字符串的4种方式
文章目录 Python格式化字符串的4种方式 一:%号 二:str.format 三:f-Strings 四:标准库模板 五:总结四种方式的应用场景 Python格式化字符串的4种方式 一:%号 %号 ...
最新文章
- spring_bean三种装配方式
- Vs2008 开发Wap 网站
- 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)
- 初一模拟赛总结(2019.6.15)
- 【渝粤题库】广东开放大学 文化产业经济学 形成性考核
- websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)
- Bootstrap 幻灯片效果
- 360全景倒车影像怎么看_别克关怀-后视镜和倒车影像 倒车时到底看哪个
- 13 - java包装类
- [转] Android系统如何实现UI的自适应
- MySQL高可用实现:主从结构下ProxySQL中的读写分离
- 案例:按照JSP Model2思想实现用户注册功能
- 在JSP中应用JavaBean
- 定时执行sql统计数据库连接数并记录到表中
- archlinux安装mysql_在Arch Linux中安装MySQL
- 机器学习基础知识(一):机器学习三大流派
- c语言页面置换算法报告,C语言实现页面置换算法
- 微服务整合J2cache并改造使用
- js对加法计算、减法计算、乘法计算、除法计算的精度处理
- 西安电子科技大学-概率论与数理统计大作业-概率论与数理统计在日常生活和社会经济中的应用