在网上看了有关python实现单例模式的博客,发现好多都是转载的,并且都是按照python2.x版本旧式类的方式写的。
虽然也能读懂,但对于我这种一开始学的就是python3.x的新手来说,心里总有点别扭。
所以今天我就把搜集来的单例模式稍加修改一下,以新式类的方式写下来。
1.在写代码之前,先理解一个概念,那就是元类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 __mettaclass__ = 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 __mettaclass__ = 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