• Python 单例模式


    1,单例模式的定义

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

    2,单例模式的应用场景

    • 需要频繁的进行创建和销毁的对象;
    • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
    • 工具类对象;
    • 频繁访问数据库或文件的对象。

    3,单例模式模式实现方式

      1. 利用__new__方法

    # 第一种 __new__
    class Singleton(object):
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if cls._instance is None:
                cls._instance = object.__new__(cls)
    
                return cls._instance
            else:
                return cls._instance
    
    
    class MyClass(Singleton):
        a = 1
    
    
    a = MyClass()
    b = MyClass()
    print(a.a)
    print(b.a)

      另一种写法

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, "_instance"):
                orig = super(Singleton, cls)
                cls._instance = orig.__new__(cls, *args, **kwargs)
            return cls._instance
    
    class MyClass(Singleton):
        a = 123
    
    ret = MyClass()
    print(ret.a)

    2,共享属性 :创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

    class Singleton(object):
        _data = {}
    
        def __new__(cls, *args, **kwargs):
            ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
            ob.__dict__ = cls._data
            return ob
    
    
    class MyClass2(Singleton):
        b = 3
    
    
    b = MyClass2()
    print(b.b)
    

      3, 装饰器版本

    def singleton(cls):
        instances = {}
    
        def get_instance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
    
        return get_instance
    
    
    @singleton
    class MyClass(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    c = MyClass("yu", 33)
    d = MyClass('ad', 88)
    print(c, d)
    View Code

      4, import 方法  作为python的模块是天然的单例模式

  • 相关阅读:
    EF数据迁移完整步骤
    ajax跨域最全解决方案
    WPF控件与WPF窗体
    WPF模板是把控件MVC模式化
    对象与类型
    Java加权负载均衡策略
    db2列式存储
    linux离线安装mongodb及java调用
    python合并目录下excel数据
    python多线程迁移db2数仓9T数据
  • 原文地址:https://www.cnblogs.com/yzxing/p/10533462.html
Copyright © 2020-2023  润新知