Python(16)——python中的单例模式


1、什么是单例模式

  • 一个类只能实例化一个对象的设计模式称为单例模式。

  • 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

class People(object):
    pass

p1 = People()  # object
p2 = People()  # object
print(p1, p2)  # 每个对象的内存地址不同,肯定不是单例模式

输出:
<__main__.People object at 0x000001E5F96D8580> <__main__.People object at 0x000001E5F96D8760>

2、基于装饰器实现的单例模式

from functools import  wraps
## 生成装饰器
def singleton(cls):
    # 通过一个字典存储类和对象信息{"Class":"object"}
    instances = {}
    @wraps(cls)
    def wrapper(*args, **kwargs):
        # 为了保证单例模式, 判断该类是否已经实例化为对象
        # 1. 如果有对象,直接返回存在的对象
        # 2. 如果没有则实例化对象, 并存储类和对象到字典中, 最后返回对象
        if instances.get(cls):
            return instances.get(cls)
        object = cls(*args, **kwargs)
        instances[cls] = object
        return  object
    return  wrapper

@singleton
class People(object):
    pass

p1 = People()
p2 = People()
print(p1,p2)
print(p1 is p2)  ## true 为单例模式

3、基于new方法实现的案例模式

_ _new_ _ 方法是在实例化对象之前执行的内容
_ _init_ _ 方法是在实例化对象之后执行的内容
class People(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        """创建对象之前执行的内容"""
        if cls._instance is None:
            cls._instance = object.__new__(cls)
        return  cls._instance

    def __init__(self):
        """实例化对象之后执行, 将属性和对象封装在一起"""
        print("正在执行构造方法init......")

p1 = People()
p2 = People()
print(p1, p2)
print(p1 is p2)  ## true是单例模式
输出:
正在执行构造方法init......
正在执行构造方法init......
<__main__.People object at 0x000002534DEE8760> <__main__.People object at 0x000002534DEE8760>
True

### 单例模式简介 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在Python中,实现这一模式有多种方式。 ### 使用模块级别全局变量 一种简单的方法是在模块级别定义一个全局变量来保存类的唯一实例[^1]: ```python class Singleton: _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance ``` 这种方法通过重写`__new__()`方法,在第一次调用时创建对象并将其存储到类属性 `_instance` 中;之后每次再尝试创建新对象时都会返回之前已经存在的那个实例。 ### 利用装饰器函数 另一种常见做法是利用装饰器来控制类的实例化过程[^3]: ```python def singleton(cls): instances = {} def get_instance(*args, **kwarsg): if cls not in instances: instances[cls] = cls(*args, **kwarsg) return instances[cls] return get_instance @singleton class MyClass: pass ``` 这里定义了一个名为 `singleton` 的装饰器,用于管理不同类型的单例对象。每当应用此装饰器于某个特定类之上时,就会自动维护该类的所有实例记录。 ### 借助元类机制 更进一步地,还可以借助Python中的元类功能来达成同样的效果[^4]: ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance return cls._instances[cls] class MySingletonClass(metaclass=SingletonMeta): pass ``` 上述代码展示了如何自定义一个继承自 `type` 类型的新元类——`SingletonMeta` ,并通过覆写其默认行为实现了对子类实例化的严格限制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值