2010-10-29 77 views
1

剛剛在字典「類型」子類遇到問題。我沒有覆蓋_ _ ITER _ _方法和預期會影響其他的方法,如出iterkeys,鑰匙等,因爲我相信他們所說_ _ ITER _ _方法來獲取值,但似乎他們是獨立實現,我一定要覆蓋所有的他們。Python std方法層次結構調用記錄?

這是一個錯誤或意圖,他們沒有使用其他方法,並單獨檢索值?

我沒有在標準類的方法之間的標準Python文檔描述中找到調用依賴關係。對於分類工作以及定位需要哪些方法來覆蓋適當的行爲將很方便。是否有一些關於python基礎類型/類內部的補充文檔?

回答

5

子類MappingMuteableMapping來自collections module而不是dict,您可以免費獲得所有這些方法。

這裏是一個最小的映射的例子,一些你免費獲得方法:

import collections 
class MinimalMapping(collections.Mapping): 
    def __init__(self, *items): 
     self.elements = dict(items) 
    def __getitem__(self, key): 
     return self.elements[key] 
    def __len__(self): 
     return len(self.elements) 
    def __iter__(self): 
     return iter(self.elements) 

t = MinimalMapping() 
print (t.iteritems, t.keys, t.itervalues, t.get) 

要繼承任何內建的容器,應始終使用適當的基類從集合模塊。

+0

+1中刪除的功能,因爲這是正確的做法! – jathanism 2010-10-29 16:16:30

+0

Thx提示。我曾經提到過dict作爲例子。我正在尋找一個更一般的Python子類化原則。 – 2010-10-29 16:19:50

+0

@大衛UNRIC:這是* *的一般原則..'dict'等的意思是儘可能快的,不要輕易擴展 - 這就是集合模塊中的基類是。 – 2010-10-29 16:36:47

2

如果未在文檔中指定,則爲實現特定。 CPython可能會重新使用iter方法來實現iterkeys和其他的實現。我不認爲這是一個錯誤,而只是實現者的一點自由。

我懷疑在獨立實現這些方法時存在性能因素,特別是在Python中廣泛使用字典時。

所以基本上,你應該實現它們。

+0

是的,我確實認爲這是實現它們的方式。其他人可以確認它不是一個bug或Pyton 3.x – 2010-10-29 16:23:23

1

你知道這句話:「你知道當你假設會發生什麼。」 :-)

他們沒有正式記錄那些東西,因爲他們可能決定在將來改變它。您可能會發現任何非官方文檔都會記錄一個Python實現的當前行爲,並依賴它會導致您的代碼非常非常脆弱。

當有特殊的方法的正式文件,它往往用來描述解釋的行爲相對於你自己的類,如使用__len__()時未實現__nonzero__(),或者只需要__lt()__排序。

由於Python使用鴨子打字,通常實際上並不需要從內置類繼承,使您自己的類像一個類一樣。所以你可能會重新考慮子類化dict是否真的是你想要做的。您可以選擇不同的類,例如collections模塊中的某個類,或者封裝而不是繼承。 (UserString類使用封裝。)或者從頭開始。

0

取而代之的是繼承dict,你可以改爲創建自己的類,它的正好是所需的屬性,而不會有太多的麻煩。這裏有一個blog的帖子,舉例說明了如何做到這一點。其中的__str__()方法並不是最大的,但這很容易糾正,剩下的就提供了您尋求的功能。