super已經有人解釋了,就不畫蛇添足了。d['c'] = 100
d.c-------->不加__getattr__()會顯示訪問失敗
d['c']和d.c是有什么區別嗎
第一眼看上去感覺是JS開發者。。。d.c,訪問的是d的屬性,你也發現了,訪問的是__getattr__,Python用一個字典維護著屬性。
d['c'],訪問的是__getitem__,通過這個方法訪問字典內部的數據結構。
python根據key獲取value值,對于d['c'],字典中的鍵是字符串'c',而d.c在Python語境中,認為c是d的一個屬性,而不是字典的鍵。
舉個例子:
>>> a = {(1, 2): 'ab'}
>>> a[(1, 2)]
'ab'
按照試圖用屬性訪問的話,難不成寫成a.(1,2)這樣的形式?這根本不是合法的Python語句。
python中數字字符和數字值有何不同。所以訪問字典中的鍵,還是用方括號吧。
補充:
其實,你要是真想這么做,完全不用自己寫__getattr__,只要這么做就行了。加不加super,就看自己需求了。
class Dict(dict):
def __init__(self, **kw):
self.__dict__ = self
python菜鳥教程,但強烈不建議這么做。Python的鍵和屬性訪問在語義上有明確的區別,最好還是分開使用。
再補充:
評論有朋友指出不要繼承dict,這是對的。但我想有人會問那應該繼承什么,答案是collections模塊中的MutableMapping這個ABC。(不過好像走題了。。)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态