zoukankan      html  css  js  c++  java
  • Python单例模式实现方法

    一  简介

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

    关键点:

    • 某个类只能有一个实例;
    • 它必须自行创建这个实例;
    • 它必须自行向整个系统提供这个实例。

    二  实例

    1  简单方法

    class Singleton:
        __instance = None
    
        @classmethod
        def get_instance(cls):
            if cls.__instance:
                return cls.__instance
            cls.__instance = Singleton()
            return cls.__instance
    
    obj1 = Singleton.get_instance()
    print(obj1)
    obj2 = Singleton.get_instance()
    print(obj2)
    obj3 = Singleton.get_instance()
    print(obj3)
    

    结果:

    <__main__.Singleton object at 0x7f85d7044ac8>
    <__main__.Singleton object at 0x7f85d7044ac8>
    <__main__.Singleton object at 0x7f85d7044ac8>
    

    2  基于简单方法的变种1

    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 Foo(Singleton):
        pass
    
    
    obj1 = Foo()
    obj2 = Foo()
    print(obj1)
    print(obj2)
    

     结果:

    <__main__.Foo object at 0x7fed34a48c18>
    <__main__.Foo object at 0x7fed34a48c18>
    

     3  基于简单方法的变种2

    class Singleton(object):
        _state = {}
        def __new__(cls, *args, **kwargs):
            ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
            ob.__dict__ = cls._state
            return ob
    
    class Foo(Singleton):
        pass
    
    obj1 = Foo()
    obj2 = Foo()
    print(id(obj1.__dict__))
    print(id(obj2.__dict__))
    

     结果:

    140131036531976
    140131036531976
    

    三  应用场景

    由上边的实例可以看出,创建对象时,在内存中只保存一份,非常节省内存。然而,我们在什么时候会用到单例模式呢?

    1. 数据库连接池

    我们可以用单例模式创建一个数据库连接池,每个用户请求都可以用这个公用的数据库连接池来操作数据库。永远使用一个实例对象,从而省去了各个用户分别连接数据库时消耗的时间。

    2. tornado的ioloop中的实例

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/pyramid1001/p/6547893.html
Copyright © 2011-2022 走看看