面试-python单例模式实现

概念:
一个对象只能最多存在一个实例

优点:
节省资源空间

缺点:
多线程失效,需要加锁解决

两种实现方式:

需要用到的知识点
1.单例模式思想

2.装饰器

3.类对象
4.__new__方法

4.with语句
5.多线程资源竞争使单例模式失效,导致脏读,使用锁解决

# 方式1:装饰器实现 非线程安全
def singleton(cls):
    _instances = {}
    def wrapper(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]
    return wrapper
@singleton
class ConfigManager:
    def __init__(self):
        self.settings = {}
# 方式1:装饰器实现 线程安全
import threading
def singleton(cls):
    __instances = {}
    __lock = threading.Lock()
    def wrapper(*args, **kwargs):
			with __lock:
		       if cls not in _instances:
		           _instances[cls] = cls(*args, **kwargs)
		       return _instances[cls]
    return wrapper
    
@singleton
class ConfigManager:
    def __init__(self):
        self.settings = {}
# 方式2:__new__方法重写    重点++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class CacheManager:
    _instance = None
    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance._cache = {}
        return cls._instance
# 方式2:线程安全版(带锁)
from threading import Lock

class ThreadSafeSingleton:
    _instance = None
    _lock = Lock()
    
    def __new__(cls):
        if not cls._instance:
            with cls._lock:
                if not cls._instance:
                    cls._instance = super().__new__(cls)
        return cls._instance

方式3:
所有模块导入的类也是默认单例

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值