在Python中用尽量多的方法实现单例模式
生活随笔
收集整理的這篇文章主要介紹了
在Python中用尽量多的方法实现单例模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、模塊單例
Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。
#foo1.py class Singleton(object):def foo(self):pass singleton = Singleton()#foo.py from foo1 import singleton直接在其他文件中導入此文件中的對象,這個對象即是單例模式的對象
二、靜態變量方法
先執行了類的__new__方法(我們沒寫時,默認調用object.__ new__),實例化對象;然后再執行類的__init__方法,對這個對象進行初始化,所有我們可以基于這個,實現單例模式。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Singleton(object):def __new__(cls,a):if not hasattr(cls, '_instance'):cls._instance = object.__new__(cls)return cls._instancedef __init__(self,a):self.a = adef aa(self):print(self.a)a = Singleton("a")變種:利用類的靜態方法或者類方法,實現對函數初始化的控制。該方法需要手動調用靜態方法實現實例。本質上是手動版的__ new__方法。
三、元類方法
此方法是在__new__方法的更上層對實例化過程進行控制。
原理:執行元類的 元類的__new__方法和__init__方法用來實例化類對象,__ call__ 方法用來對實例化的對象的實例即類的對象進行控制。__call__方法會調用實例類的 __new__方法,用于創建對象。返回對象給__call__方法,然后調用類對象的 __init__方法,用于對對象初始化。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和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 Singleton2(type):_inst = {}def __call__(cls, *args, **kwargs):print(cls)if cls not in cls._inst:cls._inst[cls] = super(Singleton2, cls).__call__(*args)return cls._inst[cls]class C(metaclass=Singleton1):pass四、裝飾器
原理:裝飾器用來控制類調用__ call__方法。
def singleton(cls, *args, **kw):instance = {}def _singleton(args):if cls not in instance:instance[cls] = cls(*args, **kw)return instance[cls]return _singleton@singleton class A:pass總結
以上是生活随笔為你收集整理的在Python中用尽量多的方法实现单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中文件读写之 w+ 与 r+
- 下一篇: 列举Python中常见的内置函数