目錄
#1、什麼是Python元類別
2、什麼是單例模式
3、利用__new__實作單例
4、利用元類別__call__實作單例
首頁 後端開發 Python教學 Python元類別下單例模式的使用介紹(程式碼範例)

Python元類別下單例模式的使用介紹(程式碼範例)

Sep 12, 2018 pm 03:13 PM
單例模式

本篇文章帶給大家的內容是關於Python元類下單例模式的使用介紹(程式碼範例) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

#1、什麼是Python元類別

#參考文章什麼是Python元類別? Python元類別的介紹

2、什麼是單例模式

單例模式(Singleton pattern)是常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類別。透過單例模式可以確保系統中一個類別只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類別的物件只能存在一個,單例模式是最好的解決方案。

如何保證一個類別只有一個實例並且這個實例很容易被存取呢?定義一個全域變數可以確保物件隨時都可以被訪問,但不能防止我們實例化多個物件。一個更好的解決辦法是讓類別本身負責保存它的唯一實例。這個類別可以保證沒有其他實例被創建,並且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。

3、利用__new__實作單例

# -*- coding: utf8 -*-

class Singleton(object):
    def __init__(self):
        print 'entrance of __init__'

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

if __name__ == '__main__':
    s1 = Singleton()
    s2 = Singleton()

    print s1, s2
登入後複製

 Python中通常利用__new__函數實作單例模式。 __new__函數負責建構對象,類似C 中的建構子。因此為了讓類別只能建立一個實例對象,我們可以重載__new__函數的行為,使其只能建構一個實例。在上述程式碼中,賦予Singleton類別了一個_instance屬性,如果_instance屬性為None則建立實例對象,並使_instance屬性參考(指向)該對象,否則直接傳回_instance所引用的物件。因此程式碼中的s1和s2實際上引用了同一個記憶體物件。

4、利用元類別__call__實作單例

# -*- coding: utf8 -*-

# 单例模式
class SingletonMetaClass(type):
    def __init__(cls, *args, **kwargs):
        """
        初始化类
        :param args:
        :param kwargs:
        """
        print 'MetaClass.__init__ called'
        print cls._instance
        super(SingletonMetaClass, cls).__init__(*args, **kwargs)


    def __new__(cls, name, bases, attrs):
        """
        创建类,负责类的行为和属性的创建
        :param name:
        :param bases:
        :param attrs:
        :return:
        """
        print 'MetaClass.__new__ called'

        # 单例模式
        cls._instance = None

        return type.__new__(cls, name, bases, attrs)

    # __call__方法其实和类的创建过程和实例化没有多大关系了,定义了__call__方法才能被使用函数的方式执行。
    # 被该元类创建的类,属于该元类的一个实例。因此创建其实例的时候,会调用元类的__call_方法
    def __call__(cls, *args, **kwargs):
        """
        使类变为可调用对象
        :param args:
        :param kwargs:
        :return:
        """
        print 'MetaClass.__call__ called'
        if cls._instance is None:
            # 这里会去调用类的__new__函数
            cls._instance = super.__call__(SingletonMetaClass, cls).__call__(*args, **kwargs)
        return cls._instance

class A():
    __metaclass__ = SingletonMetaClass

    def __new__(cls, *args, **kwargs):
        print 'A.__new__ called'
        return super(A, cls).__new__(cls, *args, **kwargs)

if __name__ == '__main__':
    # 因为类A是SingletonMetaClass的一个实例,执行A()时会调用元类SingletonMetaClass的__call__方法
    a1 = A()
    print a1
    a2 = A()
    print a2
登入後複製

 我們知道,在Python中類別也是對象,元類別是建立類別的類,因此類別其實是元類別的實例物件。在Python中,如果一個物件定義了__call__方法,那麼該物件為可呼叫對象,意思是可以用呼叫函數的形式來呼叫物件。

Python的__new__方法負責建立對象,__init__方法負責初始化物件。在上述程式碼中,只有在創建類別A後才能建立類別A的物件,因此為了先建立出類別A,SingletonMetaClass的__new__和__init__方法會先被執行。當執行語句A()建立類別A的物件時,根據__call__方法的定義,由於類別A是元類別SingletonMetaClass的對象,所以可以預料元類別SingletonMetaClass的__call__方法會呼叫。

因此上述程式碼中SiingletonMetaClass的__new__和__init__方法只執行一次,而每次呼叫A()建立類別A的實例時,都會呼叫SingletonMetaClass的__call__方法。因此為了實現單例模式,我們在元類別的__call__方法中判斷了cls的_instance屬性是否為None,如果為None則呼叫元類父類(即type)的__call__方法,type.__call_ _方法會呼叫類別A的__new__方法建立類別A的一個實例,然後將_instance屬性指向該實例,從而實現只有一個實例。以下是一次執行結果:

MetaClass.__new__ called
MetaClass.__init__ called
None
MetaClass.__call__ called
A.__new__ called
<__main__.A object at 0x00000000036D2EB8>
MetaClass.__call__ called
<__main__.A object at 0x00000000036D2EB8>
登入後複製

相關推薦:

Python使用設計模式中的責任鏈模式與迭代器模式的範例

Python使用redis pool的單例實作方式介紹

#

以上是Python元類別下單例模式的使用介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
一文理解JavaScript中的單例模式 一文理解JavaScript中的單例模式 Apr 25, 2023 pm 07:53 PM

JS 單例模式是常用的設計模式,它可以保證一個類別只有一個實例。這種模式主要用於管理全域變量,避免命名衝突和重複加載,同時也可以減少記憶體佔用,提高程式碼的可維護性和可擴展性。

C++ 函式重載與重寫中單例模式與工廠模式的運用 C++ 函式重載與重寫中單例模式與工廠模式的運用 Apr 19, 2024 pm 05:06 PM

單例模式:透過函數重載提供不同參數的單例實例。工廠模式:透過函數重寫建立不同類型的對象,實現創建過程與特定產品類別的解耦。

PHP中單例模式的線程安全性問題思考 PHP中單例模式的線程安全性問題思考 Oct 15, 2023 am 10:14 AM

PHP中單例模式的線程安全性問題思考在PHP程式設計中,單例模式是一種常用的設計模式,它可以確保一個類別只有一個實例,並且提供一個全域的存取點來存取這個實例。然而,在多執行緒環境下使用單例模式時,需要考慮線程安全性的問題。單例模式的最基本實作包括一個私有的建構子、一個私有的靜態變數和一個公有的靜態方法。具體程式碼如下:classSingleton{pr

PHP入門指南:單例模式 PHP入門指南:單例模式 May 20, 2023 am 08:13 AM

在軟體開發中,常常遇到多個物件需要存取同一個資源的情況。為了避免資源衝突以及提高程式的效率,我們可以使用設計模式。其中,單例模式是一種常用的創建物件的方式,即保證一個類別只有一個實例,並提供全域存取。本文將為大家介紹如何使用PHP實作單例模式,並提供一些最佳實務的建議。一、什麼是單例模式單例模式是一種常用的創建物件的方式,它的特點是保證一個類別只有一個實例,並提

在PHP中,單例設計模式是什麼概念? 在PHP中,單例設計模式是什麼概念? Aug 18, 2023 pm 02:25 PM

Singleton模式確保一個類別只有一個實例,並提供了一個全域的存取點。它確保在應用程式中只有一個物件可用,並處於受控狀態。 Singleton模式提供了一種訪問其唯一物件的方式,可以直接訪問,而無需實例化類別的物件。範例&lt;?php  classdatabase{   publicstatic$connection;   privatefunc

PHP 設計模式:通往程式碼卓越的道路 PHP 設計模式:通往程式碼卓越的道路 Feb 21, 2024 pm 05:30 PM

導言PHP設計模式是一組經過驗證的解決方案,用於解決軟體開發中常見的挑戰。透過遵循這些模式,開發者可以創建優雅、健壯和可維護的程式碼。它們可協助開發者遵循SOLID原則(單一職責、開放-封閉、Liskov替換、介面隔離和依賴反轉),從而提高程式碼的可讀性、可維護性和可擴展性。設計模式的類型有許多不同的設計模式,每種模式都有其獨特的目的和優點。以下是一些最常用的php設計模式:單例模式:確保一個類別只有一個實例,並提供一種全域存取此實例的方法。工廠模式:建立一個對象,而不指定其確切類別。它允許開發者根據條件

單例模式在PHP框架中的擴展與定制 單例模式在PHP框架中的擴展與定制 Oct 15, 2023 am 11:10 AM

單例模式在PHP框架中的擴展與自訂【引言】單例模式是一種常見的設計模式,它保證類別在整個應用程式中只能實例化一次。在PHP開發中,單例模式的應用非常廣泛,特別是在框架的開發和擴展。本文將介紹如何在PHP框架中擴展和自訂單例模式,並提供具體的程式碼範例。 【什麼是單例模式】單例模式是指一個類別只能有一個物件實例存在,並提供一個全域存取點供外部使用。在PHP開發中,通

單例模式在PHP分散式系統中的應用場景與執行緒安全流程 單例模式在PHP分散式系統中的應用場景與執行緒安全流程 Oct 15, 2023 pm 04:48 PM

單例模式在PHP分散式系統中的應用場景和執行緒安全流程引言:隨著網際網路的快速發展,分散式系統已成為現代軟體開發的熱門話題。而在分散式系統中,線程安全性一直是重要的問題。在PHP開發中,單例模式是一種常用的設計模式,它可以有效地解決資源共享和執行緒安全性的問題。本文將重點討論單例模式在PHP分散式系統中的應用場景和執行緒安全流程,並提供具體的程式碼範例。一、單例模式的

See all articles