2012-01-03 43 views
4

有人可以解釋什麼dict類用於?這個片段是從深入Python什麼是dict類用於

class FileInfo(dict):     
    "store file metadata" 
    def __init__(self, filename=None): 
     self["name"] = filename 

我明白key = value對與self['name'] = filename分配但到底是什麼繼承dict類與此有關?請幫助我理解。

回答

1

它用於創建自己的自定義字典類型。

您可以覆蓋__init__,__getitem____setitem__方法爲您自己的特殊目的擴展字典的用法。

閱讀Dive into Python文本中的下一節:我們使用這種繼承來處理文件信息,就像我們使用普通字典一樣。

# From the example on the next section 
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 
>>> f["name"] 
'/music/_singles/kairo.mp3' 

fileinfo類的設計,它在它的構造函數接收文件名的方式,然後讓用戶獲取文件信息,只是你從一個普通的字典中獲取值的方式。

這種類的另一個用法是創建控制其數據的字典。例如,你需要一個字典,當事物被分配時,它會做一件特殊的事情,或者從其「傳感器」鍵讀取。你可以定義特殊功能__setitem__這與鍵名敏感:

​​

或者比如你要返回一個特殊值,每次用戶讀取「溫度」鍵。爲此,您繼承了__getitem__函數:

def __getitem__(self, key): 
    if key == "temperature": 
     return CurrentWeatherTemperature() 
    else: 
     return self.data[key] 
3

如果您不熟悉面向對象編程的繼承概念,至少在this維基文章(儘管,這只是爲了介紹,可能不是最好的)。

在Python中,我們使用這個語法定義A類作爲B類的子類:

class A(B): 
    pass # empty class 

在你的榜樣,爲FileInfo類是從標準dict類型繼承你可以使用這個類的實例作爲字典(因爲它們具有常規的dict對象所具有的所有方法)。除此之外,您可以通過這樣的鍵賦值其他事情(dict用於發放該操作提供方法):

self['name'] = filename 

是這樣的解釋你想要或你不明白什麼東西?

+0

@ KL-7 - 您是否介意提供從'dict'繼承的子類的不同示例?如何在實踐中使用這個? – dopatraman 2012-01-03 17:35:41

+0

我不認爲人們經常創建'dict'或其他內置類型的子類,但是[here](http://www.voidspace.org.uk/python/odict.html)是有序字典的實現。正如你可以在[source](http://www.voidspace.org.uk/downloads/odict.py)中看到的那樣,OrderedDict類是'dict'類型的一個子類。 – 2012-01-03 18:37:53

1

當Python中的類繼承另一個類時,這意味着在繼承的類上定義的任何方法本質上都是在新創建的類上定義的。

所以當FileInfo繼承dict這意味着所有的dict類的功能現在可以FileInfo,除了任何FileInfo可以通過重新定義方法或參數聲明,或更重要的是,重寫。

由於Python中的對象dict允許鍵/值名稱對,因此這使得FileInfo可以訪問相同的機制。

+0

@ tkone - 是否繼承了鍵值對強制使用的'dict'對象?不是每個python對象都有這個能力嗎? – dopatraman 2012-01-03 17:59:52

+2

不,這就是JavaScript :)。 Python對象具有可以通過「點」符號('test.parameter')訪問的屬性。 'dict'是一個關聯數組,您可以使用關聯的鍵訪問這些值。嘗試在Python中實例化一個對象,並像訪問數組'test ['parameter']'一樣訪問它。你會得到'TypeError:'Test'對象不是可代碼化的.'現在製作一個字典並嘗試通過'點'符號來訪問它。你會'AttributeError:'dict'對象沒有屬性N' – tkone 2012-01-03 20:03:48