Python self[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

我不太明白最后一行。自我[名称] = 价值。这到底是什么意思?那是在创造一个字典吗?如果是,我如何调用这个字典或在 class 之外引用这个字典?如果不是,它有什么作用?

Response class 正在执行序列协议。那就是它将在其中定义 __setitem____getitem__ 魔术方法,这将使它的行为类似于任何序列或字典。

A python class 的行为就像一本字典。 当你这样做时: 自我["foo"] = 1234 您可以像访问 self 的普通属性一样访问它: 打印(self.foo) 功能也是如此。它用于动态扩展一个class.

Taiga 基于 django,其中 SimpleTemplateResponse comes from. It is a subclass of HttpResponse 是 dict-like object.

现在,循环首先检查是否有名称 headers 不是 None,或者 False。如果已设置,则假设 headers 是一个字典,并使用 iteritems 遍历每个 key/value 对字典。然后它复制与 class 属性相同的键和值,其中 self[name] = value.

实际上,这意味着如果有 headers,它们可以直接在 class 中作为键访问。

这是一个简单的例子来说明它的作用:

>>> 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是一个简单的class,但是它定义了一些特殊的方法__setitem____getitem____delitem__。这些方法让 class 的任何 object 像字典一样工作。

populate方法正在做原始源中循环中正在做的事情;一旦它的 运行 - 字典的所有键都成为结果 MyFoo object.

的键

source of the HttpResponse class you'll note the same __setitem__, __getitem__, __delitem__ are defined (scroll down to line 140).

您的 SimpleTemplateResponse 对象(Response 的父对象 class)将有一个 __getitem__ 和一个 __setitem__ 方法。

我不知道从 SimpleTemplateResponse 继承的 __getitem____setitem__ 方法会做什么,但我猜,在这种情况下,它将 return 响应对象的属性。

本质上,您所做的是将 Response 对象的特定属性设置为基于继承的 __getitem____setitem__ 方法中的规则的值。

You can read more here.

DjangoHttpResponse已经实现为容器(HTTP response class with dictionary-accessed headers)

关于容器的更多信息..

Python中,可以通过实施某些魔术方法创建container对象..

为了更好地理解的示例容器..

>>> 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]
... 

由于我们已经为 assiginment 实施了 __setitem__,为 get 实施了 __getitem__,为 deleting an item 实施了 __delitem__,现在 Container 对象支持所有这三种操作..

Assigning 容器对象某些属性的值..

>>> obj = Container()
>>> obj[1] = 'Assigned 1'
Setitem called for assignment!

每当我们尝试通过调用 obj[--some_attr--] = value 来为这个容器分配一些东西时,python 会检查这个 class 的 __setitem__ 方法,开发人员有责任编写他们自己的逻辑在哪里存储这些值,无论是字典还是其他数据结构..

Retrieving 来自容器的值...

>>> obj[1]
Getitem called for retrieving!
'Assigned 1'

每当我们尝试通过调用 obj[--some_attr--] 从容器中检索某些内容时,python 会检查此对象的 __getitem__ 方法,开发人员有责任编写自己的逻辑return或者在里面做一些操作..

Delete 容器中的值..

>>> del obj[1]
Delitem called for deleting item!

每当我们尝试通过调用 del obj[--some_attr--] 从容器中删除某些内容时,python 会检查此对象的 __delitem__ 方法...

因此,无论您在哪里看到 self[item] = valueself[item]del self[item] 都与使用对象相同。