2012-10-19 48 views
1

我正在製作一個派生的字典類的變體,這樣字典值可以通過屬性訪問語法來訪問(所以,而不是做字典['foo']你可以做dictionary.foo。)這就是我至今:我可以重載用於創建字典的{}運算符嗎?

class dict(dict): 
    __getattr__ = dict.__getitem__ 

然而,這段代碼我的代碼給它的問題:

eventD = {'rrule_end':None} 
. . . 
. . . 
#(some time later) 
print event.rrule_end 

這是因爲{}運營商字典制作沒有超載。是否有可能使dictName = {}語法創建派生類的實例而不是普通的字典?

+0

不回答具體問題,但我認爲你正在做已經在標準庫!看看'argparse.Namespace' – wim

回答

0

號不能覆蓋字典文字語法。 (您也不能覆蓋列表文字語法,或字符串文字語法或數字文字語法,或任何文字語法。)

你必須明確地創建類的實例。給你的類像MyDict一個名稱,然後做

eventD = MyDict({'rrule_end':None}) 
+0

好的,謝謝。我想我必須解決它。 – SoItBegins

+0

'MyDict(rrule_end = None)'也可以... – mgilson

0

不,你不能超載是語法,但他們是另類的事情可以做。

將普通的字典到你的字典

my_dict({'foo':bar, 'foo2':bar2}) 

讓你的函數接受key-args

my_dict(foo='bar', foo2='bar2') 

彌補自己的語法本字典。 這是濫用Python的重載操作,是一個有點複雜的事情。 其連鎖反應,從my_dict <「富」。 重載運算符,以便輸出另一個my_dict對象,並重復該過程,每次保留每個值的記錄,直到最終到達最終對象。 然後計算並吐出了你自己的對象的對象。

my_dict<'foo'|bar,'foo2'|'bar2'>end 

編輯:

我不知道你想這樣做的原因,但是這可能是一個備選答案,你的問題。您可能還想看看內置函數vars。這可以讓你得到一個對象具有的每個屬性的字典。如果對象更改,字典會自動更改。

class dict_obj(object): 
    def __init__(self, obj): 
     self.obj = obj 
     self.dict = vars(obj) 

    def __getattr__(self, value): 
     return self.dict[value] 
    __getitem__ = __getattr__ 

,你可以使用它像這樣

>>> class test: 
    def __init__(self): 
     self.value = 5 


>>> obj = dict_obj(test()) 
>>> obj.value 
5 
>>> obj['value'] 
5 
相關問題