美文网首页
Python装饰器实现单例

Python装饰器实现单例

作者: Aresx | 来源:发表于2019-07-12 00:38 被阅读0次

    Python装饰器实现单例

    单例目的在于创建对象时总是产生同一个对象,并不会创建新的。利用装饰器,可以在类本身不改变的前提下,将此类改为单例模式。

    利用nonlocal实现单例

    def Singleton(cls):
        _instance = None
    
        def _singleton(*args, **kargs):
            nonlocal _instance
            if _instance is None:
                _instance = cls(*args, **kargs)
            return _instance
    
        return _singleton
    
    
    @Singleton
    class A:
        pass
    
    
    for i in range(3):
        a = A()
        print(a)
    

    输出:

    <__main__.A object at 0x000001A47CBC0BE0>
    <__main__.A object at 0x000001A47CBC0BE0>
    <__main__.A object at 0x000001A47CBC0BE0>
    

    nonlocal是python3.0才可使用。

    nonlocal实现单例

    def Singleton(cls):
        _instance = {}
    
        def _singleton(*args, **kargs):
            if cls not in _instance:
                _instance[cls] = cls(*args, **kargs)
            return _instance[cls]
    
        return _singleton
    
    
    @Singleton
    class A:
        pass
    
    
    for i in range(3):
        a = A()
        print(a)
    

    输出:

    <__main__.A object at 0x000001434A3B9198>
    <__main__.A object at 0x000001434A3B9198>
    <__main__.A object at 0x000001434A3B9198>
    

    其实nonlocal解决了内嵌函数的作用域问题,内嵌函数无法修改上层函数的变量,nonlocal意味着它们位于一个嵌套的函数中。

    初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

    相关文章

      网友评论

          本文标题:Python装饰器实现单例

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