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__
方法中的规则的值。
在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]
...
由于我们已经为 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] = value
或 self[item]
或 del self[item]
都与使用对象相同。
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__
方法中的规则的值。
在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]
...
由于我们已经为 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] = value
或 self[item]
或 del self[item]
都与使用对象相同。