美文网首页
python中实现单例模式

python中实现单例模式

作者: 小蛋子 | 来源:发表于2019-02-19 11:18 被阅读0次

    python中实现单例模式的方式大致有四种:
    1.模块
    2.改写类的new方法,控制实例生成
    3.装饰器
    4.元类
    1.模块
    python中的模块是天然的单例模式,并且是线程安全的,所有的模块只会在运行时加载一次。
    所以,利用模块就可以实现一个线程安全的单例。如:

    # my singleton.py
    class My_singleton(object):
        def foo(self):
            pass
    my_singleton = My_singleton()
    
    1. new方法
      python中每个类在实例化对象时,首先会调用new方法创建一个实例,然后再调用init方法动态绑定其他属性
      如:
    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kw):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
            return cls._instance  
    class MyClass(Singleton):  
        a = 1
    

    3.装饰器
    装饰器可以动态的修改一个类或方法的表现,利用装饰器生成单例

    from functools import wraps
    
    
    def singleton(cls):
        instances = {}
    
        @wraps(cls)
        def getinstance(*args, **kw):
            if cls not in instances:
                instances[cls] = cls(*args, **kw)
            return instances[cls]
    
        return getinstance
    
    
    @singleton
    class MyClass(object):
        a = 1
    

    4.元类
    元类可以控制其子类的类对象(new)及类实例对象(call)的创建。

    class Singleton(type):
        _instances = {}
    
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
            return cls._instances[cls]
    
    
    # Python2
    class MyClass(object):
        __metaclass__ = Singleton
    
        # Python3
        # class MyClass(metaclass=Singleton):
        #    pass
    

    最著名的就是Django中的ORM,其model中就使用了元类来控制所有model的表现

    相关文章

      网友评论

          本文标题:python中实现单例模式

          本文链接:https://www.haomeiwen.com/subject/oivaeqtx.html