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)
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()

 

posted @   cnblogs用户  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示