国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python 實現(xiàn)單例模式的幾種方式以及存在的問題

這篇具有很好參考價值的文章主要介紹了Python 實現(xiàn)單例模式的幾種方式以及存在的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、模塊單例

Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當?shù)诙螌霑r,就會直接加載 .pyc 文件,而不會再次執(zhí)行模塊代碼。

#foo1.py
class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()


#foo.py
from foo1 import singleton

直接在其他文件中導入此文件中的對象,這個對象即是單例模式的對象

二、靜態(tài)變量方法

先執(zhí)行了類的__new__方法(我們沒寫時,默認調(diào)用object.new),實例化對象;然后再執(zhí)行類的__init__方法,對這個對象進行初始化,所有我們可以基于這個,實現(xiàn)單例模式。

class Singleton(object):
    def __new__(cls,a):
        if not hasattr(cls, '_instance'):
            cls._instance = object.__new__(cls)
        return cls._instance
    def __init__(self,a):
        self.a = a
    def aa(self):
        print(self.a)

a = Singleton("a")

變種:利用類的靜態(tài)方法或者類方法,實現(xiàn)對函數(shù)初始化的控制。該方法需要手動調(diào)用靜態(tài)方法實現(xiàn)實例。本質(zhì)上是手動版的__new__方法。

class Singleton:
    @staticmethod
    def instance1(*args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            Singleton._instance = Singleton(*args, **kwargs)
        return Singleton._instance

  
    @classmethod
    def instance2(cls,*args, **kwargs):
        if not hasattr(cls, "_instance"):
            Singleton._instance = Singleton(*args, **kwargs)
        return Singleton._instance


a = Singleton.instance1() 
b = Singleton.instance2() 
print(a == b)```

## 三、元類方法
此方法是在__new__方法的更上層對實例化過程進行控制。

原理:執(zhí)行元類的 元類的__new__方法和__init__方法用來實例化類對象,__call__ 方法用來對實例化的對象的實例即類的對象進行控制。__call__方法會調(diào)用實例類的 __new__方法,用于創(chuàng)建對象。返回對象給__call__方法,然后調(diào)用類對象的 __init__方法,用于對對象初始化。

```python
class Singleton1(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None
        super(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.__instance

class 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

四、裝飾器

原理:裝飾器用來控制類調(diào)用__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

五、注意

除了模塊單例外,其他幾種模式的本質(zhì)都是通過設置中間變量,來判斷類是否已經(jīng)被實例。區(qū)別就是中間變量的位置不同,或設置在元類中,或封裝在函數(shù)中,或設置在類中作為靜態(tài)變量。

注意1:中間變量的訪問和更改存在線程安全的問題:在開啟多線程模式的時候需要加鎖處理。

注意2:new__方法無法避免觸發(fā)__init(),初始的成員變量會進行覆蓋。其他方法不會。文章來源地址http://www.zghlxwxcb.cn/news/detail-814154.html

到了這里,關于Python 實現(xiàn)單例模式的幾種方式以及存在的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Qt專欄】實現(xiàn)單例程序,禁止程序多開的幾種方式

    【Qt專欄】實現(xiàn)單例程序,禁止程序多開的幾種方式

    目錄 一,簡要介紹 二,實現(xiàn)示例(Windows) 1.使用系統(tǒng)級別的互斥機制 2.通過共享內(nèi)存(進程間通信-IPC) 3.使用命名互斥鎖(不推薦) 4.使用文件鎖 5.通過網(wǎng)絡端口檢測 前言 禁止程序多開,也稱為“單實例應用程序”或“單例應用程序”,是指通過各種手段防止同一個應用

    2024年02月10日
    瀏覽(41)
  • Jenkins的幾種安裝方式以及郵件配置

    Jenkins的幾種安裝方式以及郵件配置

    目錄 Jenkins介紹 Jenkins下載、安裝 一、通過war包安裝 二、通過docker安裝 jenkins 容器中添加 git, maven 等組件 jenkins 容器中的公鑰私鑰 在 jenkins 容器中調(diào)用 docker 簡單的方式啟動 Docker server REST API 一個 jenkins 示例 三、通過Homebrew安裝 訪問Jenkins、Jenkins配置 Jenkins配置郵件發(fā)送 Jen

    2024年02月16日
    瀏覽(37)
  • uniapp頁面跳轉的幾種方式 以及舉例(2)

    uniapp頁面跳轉的幾種方式 以及舉例(2)

    又來混時長 嫖流量卷了 保留當前頁面,跳轉到應用內(nèi)的某個頁面,使用 uni.navigateBack 可以返回到原頁面。 ? 關閉當前頁面,跳轉到應用內(nèi)的某個頁面。 ? 關閉所有頁面,打開到應用內(nèi)的某個頁面。 跳轉到 tabBar 頁面,并關閉其他所有非 tabBar 頁面。 關閉當前頁面,返回上一

    2024年01月19日
    瀏覽(83)
  • mysql備份以及還原表與庫的幾種常見方式

    (1)備份包括系統(tǒng)數(shù)據(jù)庫在內(nèi)的所有數(shù)據(jù)庫(所有庫表結構及數(shù)據(jù)) 備注:例子是備份本地庫到本地目錄,如需備份其他機器上的mysql數(shù)據(jù)庫到本地需要加上端口參數(shù)以及主機地址(以下類似): ? (2)備份單個庫(單個庫表結構及數(shù)據(jù)) (3)備份單個庫里的單個表(單個表

    2024年02月01日
    瀏覽(22)
  • 單例模式有幾種寫法?【如何實現(xiàn)單例模式?】

    專注 效率 記憶 預習 筆記 復習 做題 歡迎觀看我的博客,如有問題交流,歡迎評論區(qū)留言,一定盡快回復?。ù蠹铱梢匀タ次业膶冢撬形恼碌哪夸洠?文章字體風格: 紅色文字表示:重難點★? 藍色文字表示:思路以及想法★? 如果大家覺得有幫助的話,感謝大家?guī)?/p>

    2024年02月07日
    瀏覽(20)
  • python的幾種輸出方式

    python的幾種輸出方式

    1.輸出百分比方法 2. print(f “{}”) 的用法 3. .format格式 ? 4. 加號拼接(針對字符串) 擴展知識 -格式化輸出 字符 含有 %s 字符串 %d 有符號十進制整數(shù),%06d表示輸出的整數(shù)顯示位數(shù)字,不足的地方使用0補全 %f 浮點數(shù),%.02f表示小數(shù)點后只顯示兩位 %% 輸出% ?%s:代表字符串的占

    2024年04月15日
    瀏覽(25)
  • 實戰(zhàn)講解及分析Spring新建Bean的幾種方式以及創(chuàng)建過程(圖+文+源碼)

    實戰(zhàn)講解及分析Spring新建Bean的幾種方式以及創(chuàng)建過程(圖+文+源碼)

    作為一個應用開發(fā)人員而言,會使用某一個工具分為兩個層次(個人觀點): 第一個層次,知道工具,會使用這個工具解決問題; 第二個層次,理解工具的實現(xiàn)原理。 關于Spring的學習,還在第一個層次轉悠,缺少原理的研究, 隨著學習的深入,開始研究些Spring源碼,配合

    2023年04月08日
    瀏覽(18)
  • springBoot使用webSocket的幾種方式以及在高并發(fā)出現(xiàn)的問題及解決

    springBoot使用webSocket的幾種方式以及在高并發(fā)出現(xiàn)的問題及解決

    1、該類可以作為一個基礎的安全抽象層,后續(xù)項目中如果需要做認證的操作,都可以繼承該抽象類 ClientUserInfoService 大家可以看作一個 UserService 就是一張用戶表的service類 這里認證采用的是 jwt的方式,大家可以換成自己的 2、 大家這里注意,我們使用的是 javax.websocket.Sessio

    2024年02月09日
    瀏覽(18)
  • Python 打開網(wǎng)頁的幾種方式

    方法1:直接調(diào)用系統(tǒng)命令 os 方法2:引用webrowser包 方法3:引用selenium工具,解決閃退問題 附:Pycharm 安裝selenium 工具說明

    2024年02月16日
    瀏覽(24)
  • python數(shù)組循環(huán)的幾種方式

    ?Python中循環(huán)數(shù)組有幾種方式: for-in循環(huán),可以遍歷數(shù)組中的每一個元素。 while循環(huán),使用索引進行循環(huán)。 列表推導式,可以快速創(chuàng)建新的列表。 遞歸,可以遍歷多維數(shù)組。 enumerate() 函數(shù),在循環(huán)中同時獲取索引和元素

    2024年02月16日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包