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

时间:2015-11-16 05:56:26

标签: python django sequence

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。这究竟意味着什么?这会创造一个字吗?如果是,我如何调用此词典或在课堂外引用此词典?如果没有,它会做什么?

5 个答案:

答案 0 :(得分:5)

Taiga基于django,SimpleTemplateResponse来自哪里。它是HttpResponse的子类,它是一个类似dict的对象。

现在,循环首先检查名称headers是否为None或False。如果已设置,则假设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对象的键。

source of the HttpResponse class中,您会注意到相同的__setitem____getitem____delitem__已定义(向下滚动到line 140)。

答案 1 :(得分:1)

Response类正在实现序列协议。它将在其中定义__setitem____getitem__魔术方法,这将使其行为与任何序列或词典一样。

答案 2 :(得分:1)

Django HttpResponse已实施为容器(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]
... 

我们为__setitem__实施了assiginment,为__getitem__实施了get,为__delitem__实施了deleting an item,现在为{{1} object支持所有这三个操作..

Container值为Container对象的某个属性..

Assigning

当我们尝试通过调用>>> obj = Container() >>> obj[1] = 'Assigned 1' Setitem called for assignment! 来为此容器分配内容时,python会检查此类的obj[--some_attr--] = value方法,并且开发人员有责任编写自己的逻辑存储位置这些价值观,无论是dict还是其他数据结构......

__setitem__来自容器的值......

Retrieving

当我们尝试通过调用>>> obj[1] Getitem called for retrieving! 'Assigned 1' 来从容器中检索某些内容时,python会检查此对象的obj[--some_attr--]方法,并且开发人员有责任编写自己的逻辑以返回或在里面做一些操作..

来自容器的

__getitem__值..

Delete

当我们尝试通过调用>>> del obj[1] Delitem called for deleting item! 来删除容器中的内容时,python会检查此对象的del obj[--some_attr--]方法...

因此,您可以看到__delitem__self[item] = valueself[item]与使用对象执行此操作相同。

答案 3 :(得分:0)

您的SimpleTemplateResponse对象({1}}的父类)将采用Response__getitem__方法。

我不知道从__setitem__继承的__getitem____setitem__方法会做什么,但我猜测,在这种情况下,它会返回一个属性一个响应对象。

基本上您正在做的是根据继承的SimpleTemplateResponseResponse方法中的规则,将__getitem__对象的特定属性设置为值。

You can read more here.

答案 4 :(得分:-1)

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

相关问题