簡體   English   中英

Python [name] = value意味着什么?

[英]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] = valueself[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM