python 设计模式之单例模式

python 设计模式之单例模式
  • 定义:

    • 让类创建的对象,在系统中只有唯一的一个实例
  • 应用场景:

    • 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
    • 控制资源的情况下,方便资源之间的互相通信。如线程池等。
      1. 网站的计数器
      2. 应用配置
      3. 多线程池
      4. 数据库配置,数据库连接池
      5. ‘应用程序日志应用
  • 案例:

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    # @Author         : Charlie Zhang
    # @Email          : charlie.zhang@wiwide.com
    # @Time           : 2021/3/25 22:00
    # @Version        : 1.0
    # @File           : singleton.py
    # @Software       : PyCharm
    
    
    class SingleTon:
        __instance = None  # 记录单例对象
    
        def __new__(cls, *args, **kwargs):
            if cls.__instance is None:  # 判断单例对象是否存在
                cls.__instance = super().__new__(cls)  
            return cls.__instance  # 返回单例对象
    
    
    class Person(SingleTon):
        pass
    
    
    if __name__ == '__main__':
        p1 = Person()
        p2 = Person()
        print(id(p1))
        print(id(p2))
    	
        结果:
        1880300246296
    	1880300246296
    
  • 带参数的单例,参数一致时只创建一次。(利用字典key唯一的特点实现)

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    # @Author         : Charlie Zhang
    # @Email          : charlie.zhang@wiwide.com
    # @Time           : 2021/3/25 22:00
    # @Version        : 1.0
    # @File           : singleton.py
    # @Software       : PyCharm
    
    
    class Person:
        _instance_ = {}
    
        def __new__(cls, name):
            if name not in cls._instance_:
                cls._instance_[name] = super().__new__(cls)
            return cls._instance_[name]
    
        def __init__(self, name):
            self.name = name
    
    
    if __name__ == '__main__':
        p1 = Person('杨过')
        p2 = Person('小龙女')
        p3 = Person('小龙女')
        print(id(p1))
        print(id(p2))
        print(id(p3))
    	
    	
    	结果:
    	2419122689808
        2419152504312
        2419152504312
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值