• Python单例模式的四种方法


    转自https://www.cnblogs.com/delav/p/9327863.html

    在这之前,先了解super()和__new__()方法

    super()方法:

    返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法。

    它有两个典型作用:

    a. 在单继承的类层次结构中,super()可用于引用父类而不显式父类名称,从而使代码更易于维护。

    b. 在多重继承中,可以保证公共父类仅被执行一次。

    __new__方法:

    a.它是一个类级别的静态方法。通常用于控制生成一个新实例的过程。

    b.返回的是一个实例化出来的实例

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

    1. 使用__new__方法

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                orig = super(Singleton, cls)
                cls._instance = orig.__new__(cls, *args, **kwargs)
            rerurn cls._instance
    
    class A(Singleton):
        pass
    
    # 类A即为单例类

    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()
  • 相关阅读:
    Linux下运行java项目
    Matlab 绘图完整入门
    Matlab命令合集 妈妈再也不用担心我不会用matlab了
    详尽全面的matlab绘图教程
    拉格朗日乘子法 那些年学过的高数
    【转】几款网络仿真软件的比较
    正则表达式30分钟入门教程 ——堪称网上能找到的最好的正则式入门教程
    并发编程详细整理
    高并发通信模型NIO
    Java并发编程的艺术笔记(九)——FutureTask详解
  • 原文地址:https://www.cnblogs.com/shengguorui/p/10815833.html
Copyright © 2020-2023  润新知