[英]Python what does self[name] = value means?
Python新手在這里。 我正在閱讀基於Django的Taiga項目的部分代碼。 我無法理解一行代碼。
class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
super().__init__(None, status=status)
self.data = data
self.template_name = template_name
self.exception = exception
self.content_type = content_type
if headers:
for name, value in six.iteritems(headers):
self[name] = value
我不太明白最后一行。 self [name] = value。 這究竟意味着什么? 這會創造一個字嗎? 如果是,我如何調用此詞典或在課堂外引用此詞典? 如果沒有,它會做什么?
Taiga基於django,這是SimpleTemplateResponse
來源。 它是HttpResponse
的子類,它是一個類似dict的對象。
現在,循環首先檢查是否存在非None或False的名稱headers
。 如果設置了,則假設headers
是字典,並使用iteritems循環遍歷字典的每個鍵/值對。 然后它使用self[name] = value
復制與類的屬性相同的鍵和值。
實際上,這意味着如果有標題,則可以在類中直接訪問它們作為鍵。
這是一個簡單的例子:
>>> class MyFoo(object):
... def __init__(self):
... self._data = {}
... def __setitem__(self, a, b):
... self._data[a] = b
... def __getitem__(self, a):
... return self._data[a]
... def __delitem__(self, a):
... del self._data[a]
... def populate(self, d):
... if d:
... for k,v in d.iteritems():
... self[k] = v
...
>>> headers = {'User-Agent': 'Python/2.7.5'}
>>> a = MyFoo()
>>> a.populate(headers)
>>> a['User-Agent']
'Python/2.7.5'
你可以看到, MyFoo
是一個簡單的類,但它定義了一些特殊的方法__setitem__
, __getitem__
, __delitem__
。 這些方法讓類的任何對象都像字典一樣。
populate
方法正在執行原始源中循環中正在執行的操作; 一旦運行 - 字典的所有鍵都成為生成的MyFoo
對象的鍵。
在HttpResponse類的源代碼中,您將注意到相同的__setitem__
__getitem__
, __delitem__
__getitem__
, __delitem__
已定義(向下滾動到第140行 )。
Response
類正在實現序列協議。 那就是它將在其中定義__setitem__
和__getitem__
魔術方法,這將使其表現得像任何序列或字典。
在Django
HttpResponse已經實現為一個容器( HTTP response class with dictionary-accessed headers
)
更多關於容器..
在Python
可以通過實現某些魔術方法來創建容器對象。
樣品容器,以便更好地理解..
>>> class Container(object):
... def __init__(self):
... self.d = {}
... def __setitem__(self, i, k):
... print 'Setitem called for assignment!'
... self.d[i] = k
... def __getitem__(self, i):
... print 'Getitem called for assignment!'
... return self.d[i]
... def __delitem__(self, i):
... print 'Delitem called for assignment!'
... del self.d[i]
...
既然我們已經實現__setitem__
為assiginment
和__getitem__
為get
和__delitem__
為deleting an item
,現在Container
對象支持所有這三種操作方法。
為Container對象的某個屬性Assigning
。
>>> obj = Container()
>>> obj[1] = 'Assigned 1'
Setitem called for assignment!
當我們嘗試通過調用obj[--some_attr--] = value
為這個容器obj[--some_attr--] = value
,python會檢查這個類的__setitem__
方法,並且開發人員有責任編寫自己的邏輯來存儲這些值,無論是否為字典或其他一些數據結構..
從容器中Retrieving
值...
>>> obj[1]
Getitem called for retrieving!
'Assigned 1'
當我們嘗試通過調用obj[--some_attr--]
從容器中檢索某些內容時,python會檢查此對象的__getitem__
方法,並且開發人員有責任編寫自己的邏輯來返回或在內部執行某些操作。
從容器中Delete
值..
>>> del obj[1]
Delitem called for deleting item!
當我們嘗試通過調用del obj[--some_attr--]
從容器中刪除某些內容時,python會檢查此對象的__delitem__
方法...
所以你在哪里看到self[item] = value
或self[item]
或del self[item]
與使用object執行此操作相同。
您的SimpleTemplateResponse
對象( Response
的父類)將具有__getitem__
和__setitem__
方法。
我不知道從SimpleTemplateResponse
繼承的__getitem__
或__setitem__
方法會做什么,但我猜測,在這種情況下,它將返回響應對象的屬性。
基本上你正在做的是根據繼承的__getitem__
和__setitem__
方法中的規則將Response
對象的特定屬性設置為值。
python類的行為類似於字典。 當你這樣做:self [“foo”] = 1234你可以像self的普通屬性一樣訪問它:print(self.foo)同樣適用於函數。 它用於動態擴展類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.