• 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()
  • 相关阅读:
    Codeforces Round #197 (Div. 2)
    hdu4499Cannon(搜索)
    poj1054The Troublesome Frog
    hdu4705Y
    hdu1054Strategic Game(树形DP)
    poj2029Get Many Persimmon Trees(最大矩阵和)
    poj3280Cheapest Palindrome(记忆化)
    poj3140Contestants Division
    Spring的AOP机制---- 各类通知总结---- 各类通知总结
    Spring的AOP机制---- AOP最终通知---- AOP最终通知
  • 原文地址:https://www.cnblogs.com/delav/p/9327863.html
Copyright © 2020-2023  润新知