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)
原文地址:https://www.cnblogs.com/jeffrey04118110/p/11785663.html