2011-04-03 71 views
2

我知道這個問題聽起來很基本。但我無法使用Google找到它。我知道有字典看起來像如何在python中訪問哈希?

o = { 
    'a': 'b' 
} 

他們訪問與o['a']。但是那些被稱爲o.a的訪問者是什麼?我知道它們的存在是因爲我使用了optparse庫,並且它返回了一個可訪問的對象。

回答

2

使用類型的字典你不能訪問「」除非你通過派生詞典並通過'。'來提供訪問來實現你自己的字典類型。通過實施負責執行屬性樣式訪問的__getattribute__() API。

http://docs.python.org/reference/datamodel.html#object.__getattribute__

+0

我明白了。好的謝謝。只是想確保我以最好的方式進行編碼。剛剛開始學習python,我正在學習。 – fent 2011-04-03 05:55:22

0

name.attribute對象訪問在Python,不是字典訪問

1

您可以訪問的變量,如 「新樣式類」 一本字典。我認爲你必須小心謹慎。

>>> class C(object): # python 2 code, inheriting from 'object' is automatic in 3 
    a = 5 
    def __init__(self): 
     self.j = 90 


>>> c = C() 
>>> c.__dict__ 
{'j': 90} 
>>> print c.j 
90 
>>> print c.a 
5 

注意'j'出現在字典中,'a'沒有。它看起來與它們的初始化方式有關。我對這種行爲有點迷茫,不介意從大師的解釋:d

編輯:

做一點更多的上場,很明顯他們爲什麼決定去與行爲以上(但它仍然是一個有些奇怪

>>> class C(object): 
    a = 5 
    def __init__(self): 
     self.j = 90 
     self.funct = range # assigning a variable to a function 

>>> c = C() 
>>> c.__dict__ 
{'j': 90, 'funct': <built-in function range>} 

我認爲它分離類對象(這將是相同的,每類)的新類成員(如內部初始化開始),如果我現在做

>>> c.newvar = 234 
>>> c.__dict__ 
{'j': 90, 'newvar': 234, 'funct': <built-in function range>} 

你可以看到它正在建設一個字典!希望這有助於:d

2

在我看來就像optparse模擬屬性界面隱藏dict,但有文件做一些事有點類似一個標準庫,如果沒有真正的字典:collections.namedtuple。我不能對這裏介紹的其他機制說話。

0

__getattr__是你要實現的方法,用__setattr__一起。這裏是一個非常簡單的例子(沒有錯誤檢查等),顯示一個對象,它允許兩個字典樣式和屬性的方式來訪問:

Missing = object() 

class AttrElem(object): 
    def __init__(self, **kwds): 
     self.items = kwds.copy() 
    def __getitem__(self, name): 
     result = self.items.get(name, Missing) 
     if result is not Missing: 
      return result 
     raise KeyError("key %r not found" % name) 
    def __setitem__(self, name, value): 
     self.items[name] = value 
    def __getattr__(self, name): 
     result = self.items.get(name, Missing) 
     if result is not Missing: 
      return result 
     raise AttributeError("attribute %r not found" % name) 
    def __setattr__(self, name, value): 
     if name == 'items': 
      object.__setattr__(self, name, value) 
     else: 
      self.items[name] = value 
    def __repr__(self): 
     return 'AttrElem(%s)' % ', '.join(
       ["%s:%s" % (k, v) for k, v in self.items.items()] 
       ) 

在使用它看起來像這樣:

example = AttrElem(this=7, that=9) 
print(example) 
example.those = 'these' 
example['who'] = 'Guido' 
print(example) 

從代碼__getitem____getattr__可以看出,兩者都非常相似,只有當找不到目標時纔會引發異常。