繁体   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