• Python四种实现单例模式的方法


    在这之前,先了解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()
    复制代码
  • 相关阅读:
    动态多条件查询分页以及排序(一)MVC与Entity Framework版url分页版
    关于MVC3种IOC自写方法GetItems("Model名字")得到的Model为空的解决方法
    css中!important 的使用
    MVc4阅读后总结
    jquery方法off()
    关于backgroundpostion 火狐和其他浏览器的不同
    Random.Next
    sort(function(a,b){return ab})是什么
    js 简单的自制分组(类似于分页) 结合mvc3
    Discus 论坛 使用方法
  • 原文地址:https://www.cnblogs.com/mqhpy/p/11296376.html
Copyright © 2020-2023  润新知