• python基础--新式类实现单例模式


    在网上看了有关python实现单例模式的博客,发现好多都是转载的,并且都是按照python2.x版本旧式类的方式写的。

    虽然也能读懂,但对于我这种一开始学的就是python3.x的新手来说,心里总有点别扭。

    所以今天我就把搜集来的单例模式稍加修改一下,以新式类的方式写下来。

    1.在写代码之前,先理解一个概念,那就是元类metaclass,

      具体参考这篇文章:

      深刻理解Python中的元类(metaclass)

      https://www.cnblogs.com/tkqasn/p/6524879.html

      所以下面会用到__metaclass__创建类来实现单例

    2.下面是不同方法实现单例的代码

      方法一:通过__new__方法实现单例

     1 class Singleton:
     2     def __new__(cls,*args,**kwargs):
     3         if not hasattr(cls, '_instance'):
     4             cls._instance = super().__new__(cls,*args,**kwargs)
     5         return cls._instance
     6 
     7 class MyClass:
     8     __metaclass__ = Singleton
     9    
    10 print(MyClass())
    11 print(MyClass())

      方法二:通过元类实现单例

     1 class Singleton:
     2     def __init__(cls,*args, **kwargs):
     3         super().__init__(*args, **kwargs)
     4         cls.instance = None
     5     def __call__(cls, *args, **kwargs):
     6         if cls.instance is None:
     7             cls.instance = super().__call__(*args, **kwargs)
     8         return cls.instance
     9 
    10 class MyClass:
    11     __metaclass__ = Singleton
    12 
    13 print(MyClass())
    14 print(MyClass())

      方法三:通过decorator装饰器实现单例

     1 def singleton(cls, *args, **kwargs):
     2     instances = {}
     3     def get_instance():
     4         if cls not in instances:
     5             instances[cls] = cls(*args, **kwargs)
     6         return instances[cls]
     7     return get_instance
     8 
     9 @singleton
    10 class MyClass:
    11     __metaclass__ = singleton
    12 
    13 print(MyClass())
    14 print(MyClass())

      方法四:通过导入模块实现单例

    1 #  file1/mysingleton.py
    2 
    3 
    4 class Singleton:
    5     def foo(self):
    6         pass
    7 
    8 singleton = Singleton()

      注意:以上代码为一个单独模块,使用时直接导入即可。

    1 form mysingleton import singleton
    2 
    3 a = singleton
    4 b = singleton
    5 
    6 print(a)
    7 pring(b)
    8 print(a is b)
  • 相关阅读:
    强化学习——Q-learning算法
    嵌入(embedding)层的理解
    福昕PDF电子文档处理套装软件中文企业版9.01
    奇异值分解(SVD)原理与在降维中的应用
    C++ Primer 笔记——迭代器
    Windows Internals 笔记——线程局部存储区
    C/C++中二进制与文本方式打开文件的区别
    C++ Primer 笔记——固有的不可移植的特性
    C++ Primer 笔记——union
    C++ Primer 笔记——嵌套类 局部类
  • 原文地址:https://www.cnblogs.com/jeffrey04118110/p/11785663.html
Copyright © 2020-2023  润新知