网络编程
位置:首页>> 网络编程>> Python编程>> Python实现单例模式的5种方法

Python实现单例模式的5种方法

作者:云崖先生  发布时间:2021-07-13 19:40:08 

标签:Python,单例模式
目录
  • 基本介绍

  • 优缺点

  • Python实现

    • 方式1,元类实现:

    • 方式2,继承实现:

    • 方式3,装饰器实现:

    • 方式4,模块实现:

  • 方式5,@classmethod实现单例模式:

    基本介绍

    一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。

    单例模式应该是应用最广泛,实现最简单的一种创建型模式。

    特点:全局唯一,允许更改

    优缺点

    优点:

    • 避免对资源的多重占用,如写入文件操作

    • 节省内存

    • 防止命名空间被污染

    缺点:

    • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

    Python实现

    方式1,元类实现:


    class MetaClass(type):
       def __call__(self, *args, **kwargs):
           """
           self : class Singleton
           """
           if not hasattr(self, "ins"):
               insObject = super(__class__, self).__call__(*args, **kwargs)
               setattr(self, "ins", insObject)
           return getattr(self, "ins")

    class Singleton(object, metaclass=MetaClass):
       pass

    if __name__ == "__main__":
       ins = Singleton()
       print(id(ins))
       ins = Singleton()
       print(id(ins))

    方式2,继承实现:


    class ParentClass:
       def __new__(cls, *args, **kwargs) -> object:
           """
           cls : class Singeton
           """
           if not hasattr(cls, "ins"):
               insObject = super(__class__, cls).__new__(cls, *args, **kwargs)
               setattr(cls, "ins", insObject)
           return getattr(cls, "ins")

    class Singleton(ParentClass):
       pass

    if __name__ == "__main__":
       ins = Singleton()
       print(id(ins))
       ins = Singleton()
       print(id(ins))

    方式3,装饰器实现:


    def warpper(clsObject):
       def inner(*args, **kwargs):
           if not hasattr(clsObject, "ins"):
               insObject = clsObject(*args, **kwargs)
               setattr(clsObject, "ins", insObject)
           return getattr(clsObject, "ins")
       return inner

    @warpper
    class Singleton:
       pass

    if __name__ == "__main__":
       ins = Singleton()
       print(id(ins))
       ins = Singleton()
       print(id(ins))

    方式4,模块实现:


    - foo.py --> ins = Singleton()
    - bar.py --> from foo import ins

    方式5,@classmethod实现单例模式:


    class Singleton:

    @classmethod
       def getSingletonInstanceObject(cls, *args, **kwargs):
           if not hasattr(cls, "ins"):
               insObject = cls(*args, **kwargs)
               setattr(cls, "ins", insObject)
           return getattr(cls, "ins")

    if __name__ == "__main__":
       ins = Singleton.getSingletonInstanceObject()
       print(id(ins))
       ins = Singleton.getSingletonInstanceObject()
       print(id(ins))

    来源:https://www.cnblogs.com/Yunya-Cnblogs/p/14880267.html

    0
    投稿

    猜你喜欢

    手机版 网络编程 asp之家 www.aspxhome.com