python单例模式的五种实现方式
生活随笔
收集整理的這篇文章主要介紹了
python单例模式的五种实现方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
__new__特殊方法實現
class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls._instance = super(Singleton, cls).__new__(cls)return cls._instancedef __init__(self, name):self.name = names1 = Singleton('first') s2= Singleton('last') print(s1 == s2) >> True print(s1.name) >> lasttips: new__方法無法避免觸發__init(),初始的成員變量會進行覆蓋
裝飾器實現
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! '''def singleton(cls):_instance = {}def inner(*args, **kwargs):if cls not in _instance:_instance[cls] = cls(*args, **kwargs)return _instance[cls]return inner@singleton class Test:def __init__(self, name):self.name = namet1 = Test('first') t2 = Test('last') print(t1==t2) >> True print(t2.name) >> first類裝飾器實現
class Singleton:def __init__(self, cls):self._cls = clsself._instance = {}def __call__(self, *args):if self._cls not in self._instance:self._instance[self._cls] = self._cls(*args)return self._instance[self._cls]@Singleton class Cls2:def __init__(self, name):self.name = namecls1 = Cls2('first') cls2 = Cls2('last') print(id(cls1) == id(cls2)) >> True print(cls1.name) >> first元類實現
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Singleton1(type):def __init__(self, *args, **kwargs):self.__instance = Nonesuper(Singleton1, self).__init__(*args, **kwargs)def __call__(self, *args, **kwargs):if self.__instance is None:self.__instance = super(Singleton1, self).__call__(*args, **kwargs)return self.__instanceclass C(metaclass=Singleton1):def __init__(self, name):self.name = namec1 = C('first') c2 = C('last') print(c1 == c2) >> True print(c2.name) >> first模塊實現
Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。
#foo1.py class Singleton(object):def foo(self):pass singleton = Singleton()#foo.py from foo1 import singleton總結
以上是生活随笔為你收集整理的python单例模式的五种实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python获取指定目录下所有文件名os
- 下一篇: python字符串前加r、f、u、l 的