我知道這個問題聽起來很基本。但我無法使用Google找到它。我知道有字典看起來像如何在python中訪問哈希?
o = {
'a': 'b'
}
他們訪問與o['a']
。但是那些被稱爲o.a
的訪問者是什麼?我知道它們的存在是因爲我使用了optparse庫,並且它返回了一個可訪問的對象。
我知道這個問題聽起來很基本。但我無法使用Google找到它。我知道有字典看起來像如何在python中訪問哈希?
o = {
'a': 'b'
}
他們訪問與o['a']
。但是那些被稱爲o.a
的訪問者是什麼?我知道它們的存在是因爲我使用了optparse庫,並且它返回了一個可訪問的對象。
使用類型的字典你不能訪問「」除非你通過派生詞典並通過'。'來提供訪問來實現你自己的字典類型。通過實施負責執行屬性樣式訪問的__getattribute__()
API。
見http://docs.python.org/reference/datamodel.html#object.__getattribute__
name.attribute
是對象訪問在Python,不是字典訪問
您可以訪問的變量,如 「新樣式類」 一本字典。我認爲你必須小心謹慎。
>>> 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
在我看來就像optparse
模擬屬性界面隱藏dict
,但有文件做一些事有點類似一個標準庫,如果沒有真正的字典:collections.namedtuple
。我不能對這裏介紹的其他機制說話。
__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__
可以看出,兩者都非常相似,只有當找不到目標時纔會引發異常。
我明白了。好的謝謝。只是想確保我以最好的方式進行編碼。剛剛開始學習python,我正在學習。 – fent 2011-04-03 05:55:22