分享點Python學習的知識

編程語言 Python 網絡爬蟲 設計模式 Python學習開發交流 2017-05-29

分享點Python學習的知識

Python到現在為止也簡單額說了不少了,也不能說大多數人可以在其中學到什麼,但總有人能學到些什麼。寫這個也是希望能幫到一部分人。前面說了爬蟲,現在想起來,要學的還很多。現在一樣給朋友們送上點實用的東西,同樣希望能幫到一些朋友。

那麼,不多說,開始說今天談什麼------單列模式

開始之前還是介紹下什麼是單列模式,單例模式是一種常見的設計模式,在他的核心結構裡只包含一個被稱為單例的特殊類。這種模式可以保證系統中的一個類只有一個實例,並易於外部訪問,從而控制實例個數節約系統資源。比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建 AppConfig 對象的實例,這就導致系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤其是在配置文件內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。

分享點Python學習的知識

其實在Python裡,實現單列模式的方法還是很多的,比如說使用模塊 ,使用 __new__,使用裝飾器(decorator),使用元類(metaclass),也不多講了,就只舉兩個栗子吧;

我們知道,裝飾器(decorator)可以動態地修改一個類或函數的功能。這裡,我們也可以使用裝飾器來裝飾某個類,使其只能生成一個實例,代碼如下:

from functools import wraps

def singleton(cls):

instances = {}

@wraps(cls)

def getinstance(*args, **kw):

ifcls notininstances:

instances[cls] = cls(*args, **kw)

returninstances[cls]

returngetinstance

@singleton

classMyClass(object):

a = 1

在上面,我們定義了一個裝飾器 singleton,它返回了一個內部函數 getinstance,該函數會判斷某個類是否在字典 instances 中,如果不存在,則會將 cls 作為 key,cls(*args, **kw) 作為 value 存到 instances 中,否則,直接返回 instances[cls]。

元類(metaclass)可以控制類的創建過程,它主要做三件事:

  • 攔截類的創建

  • 修改類的定義

  • 返回修改後的類

用元類實現單例模式的代碼如下:

classSingleton(type):

_instances = {}

def __call__(cls, *args, **kwargs):

ifcls notincls._instances:

cls._instances[cls] = super(Singleton,cls).__call__(*args, **kwargs)

returncls._instances[cls]

# Python2

classMyClass(object):

__metaclass__ = Singleton

# Python3

# class MyClass(metaclass=Singleton):

# pass

結束了,一個人的精力有限,所以也不多說,每天有進步就可以了要知道Python 的模塊是天然的單例模式,這在大部分情況下應該是夠用的,當然了,我們也可以使用裝飾器、元類等方法。

分享點Python學習的知識

相關推薦

推薦中...