python中单例模式的四种实现方式
配置文件settings.py
IP = '100.0.0.2' PORT = 3302 |
方式一:绑定给类的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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)
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() |
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10578676.html
作者:cnblogs用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人