2017-09-15 76 views
0

所以我創造這樣一個字典:字典AttributeError的通過點操作符訪問時

request = {"method": "get"} 

,當我嘗試使用

print list(request.keys()) 

列出的屬性,我得到我所期待什麼:

['method'] 

而且我可以

訪問 method屬性210
print request['method'] 

,我得到我所期望的:

get 

但是,如果我嘗試

print request.method 

我得到一個錯誤

AttributeError: 'dict' object has no attribute 'method'

爲什麼我收到一個錯誤與.,但不是當我使用方括號?

+0

我想你來自JavaScript? –

回答

3

兩個操作轉換成不同的方法調用:

字典的API。意思是,其項目預計將通過get方法或通過[]索引進行訪問。

其中一個工作而另一個失敗的原因是操作不等效。之所以只有get[]是由於Python中的實現所致。

會員模擬接入可以通過覆蓋__getattr__很容易做到:

class AttrDict(dict): 
    def __getattr__(self, name): 
     return self[name] 

request = AttrDict({'method': 'get'}) 
method = request.method # 'get' 
+0

如果'.'轉換爲'__getattribute__',我不清楚爲什麼重寫'__getattr__'會工作? – wogsland

+0

我可能已經過分簡化了它。在訪問對象的任何屬性(如get函數或「keys」函數)之前調用__getattribute__。另一方面,__getattr__'僅在請求的屬性丟失時才被調用。在這個例子中,'__getattr__'意味着它不會隱藏'dict'的內建函數。 – Elisha

+0

有道理。謝謝! – wogsland

2

因爲你根本無法通過使用密鑰這樣得到的字典值(dict.key一樣dict["key"] - 它調用使用方法不同,如@ Elisha的回答所示)。

"method"不是一個屬性,它是一個關鍵參照"get"。在您的情況下,給定密鑰的唯一有效方法是從字典中獲取值request["method"]request.get("method", "defaultmethod")

希望這有助於!

0

點符號通常用於獲取對象的屬性。例如:

class Dog:  
    def __init__(self, name): 
     self.name = name 

d = Dog(name = 'Fuffy') 

print d.name # 'Fuffy' 

當您想通過其key得到從字典中的項目,你必須使用符號dict['key']或者,可能不太常見的,也:

dict.get(key, default=None) 

其中default(默認到None)是在密鑰不存在時要返回的值。例如

request = {"method": "get"} 
print request.get('method','foo') # get 
print request.get('bar','foo') # foo