zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    几个前端可能会遇到的小问题
    函数内部变量与该函数名冲突会怎样
    顺序表之删除算法
    顺序表之插入算法
    IPV4和IPV6的区别
    win10关闭自动更新
    spring常见十大异常
    java中list和Arrylist的区别
    垃圾收集器与内存分配策略
    java类加载机制
  • 原文地址:https://www.cnblogs.com/jeffrey04118110/p/11785663.html
Copyright © 2011-2022 走看看