zoukankan      html  css  js  c++  java
  • Python单例模式的四种方法

    在这之前,先了解_new__()方法

    __new__方法:

    a.是在实例创建之前被调用的

    b.它的任务就是创建实例然后返回该实例,是个静态方法

     总结:

          __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

          __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

          __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

          我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

    下面为四种实现单例模式的方法

    1. 使用__new__方法

    class MyClass:
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super().__new__(cls)
            return cls._instance
    
        def __init__(self, var1, var2):
            self.var1 = var1
            self.var2 = var2
    

    2.共享属性

    # 创建实例时把所有实例的__dict__指向同一个字典,这样它们都具有相同的属性和方法(类的__dict__存储对象属性)
    class Singleton(object):
        _state = {}
        def __new__(cls, *args, **kwargs):
            ob = super(Singleton,cls).__new__(cls, *args, **kwargs)
            ob.__dict__ = cls._state
        return ob
    
    class B(Singleton):
        pass
    
    # 类B即为单例类
    

    3.使用装饰器

    def singleton(cls):
        instance = {}
        def wapper():
            if cls not in instance:
                instance[cls] = cls(*args, **kwargs)
            return instance[cls]
        return wapper
    
    @singleton
    class C:
        pass
    
    # 类C即为单例类
    

    4.import方法

    # 作为Python模块时是天然的单例模式
    
    #创建一个sington.py文件,内容如下:
        class Singleton(object):
            def foo(self):
                pass
        mysington = Singleton()
    
    # 运用
    from sington import mysington
    mysington.foo()
    
  • 相关阅读:
    工作一年感想
    launcher项目踩坑小结(1)
    滕王阁序
    PC端/移动端常见的兼容性问题总结
    Java中逻辑&和短路&&,逻辑|和短路||的区别
    Linux常用指令和系统管理命令总结
    Ajax学习笔记
    js放大镜特效
    《Python for Data Science》笔记之着手于数据
    Python2&3学习中遇到的坑
  • 原文地址:https://www.cnblogs.com/zhouxiaoming123/p/12049929.html
Copyright © 2011-2022 走看看