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。这究竟意味着什么?这会创造一个字吗?如果是,我如何调用此词典或在课堂外引用此词典?如果没有,它会做什么?
答案 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] = value
或self[item]
与使用对象执行此操作相同。
答案 3 :(得分:0)
您的SimpleTemplateResponse
对象({1}}的父类)将采用Response
和__getitem__
方法。
我不知道从__setitem__
继承的__getitem__
或__setitem__
方法会做什么,但我猜测,在这种情况下,它会返回一个属性一个响应对象。
基本上您正在做的是根据继承的SimpleTemplateResponse
和Response
方法中的规则,将__getitem__
对象的特定属性设置为值。
答案 4 :(得分:-1)
python类的行为类似于字典。 当你这样做时: 自我[" foo"] = 1234 您可以像访问self的普通属性一样访问它: 打印(self.foo) 功能也是如此。它用于动态扩展类。