为什么vars(response)不显示response.text?(使用Python请求模块)

为什么vars(response)不显示response.text?(使用Python请求模块),python,python-requests,Python,Python Requests,当值存在时,vars(response)为什么不列出response.text dir(response)确实列出了response.text,但这不会打印它的值。它不在vars结果中,因为vars不会解析对象父类的属性。看 您可以通过在对象上使用dir来请求所有“属性、其类的属性以及递归地请求其类基类的属性”: import requests response = requests.get('http://httpbin.org/get') print vars(response) # no

当值存在时,
vars(response)
为什么不列出
response.text


dir(response)
确实列出了
response.text
,但这不会打印它的值。

它不在
vars
结果中,因为
vars
不会解析对象父类的属性。看

您可以通过在对象上使用
dir
来请求所有“属性、其类的属性以及递归地请求其类基类的属性”:

import requests
response = requests.get('http://httpbin.org/get')
print vars(response) # no response.text listed
print response.text # value printed

对于第一个问题,
文本
没有出现在
变量
中的原因是(由
@property
定义),而不是类属性(这是由
变量
显示的
dict
中的结果)

对于第二个问题,这是因为
dir
vars
的工作方式

vars
的文档中:

变量([对象])

返回模块、类、实例或任何对象的dict属性 具有dict属性的其他对象

模块和实例等对象具有可更新的dict 属性但是,其他对象可能对其 dict属性(例如,新型类使用dictproxy来防止直接更新字典)

在没有参数的情况下,vars()的行为类似于locals()。注意,当地人 字典只对读取有用,因为它更新了局部变量 字典被忽略了

对于
目录

默认的dir()机制在不同的类型中表现不同 对象,因为它试图产生最相关的,而不是 完整,信息:

如果对象是模块对象,则列表包含 模块的属性。如果对象是类型或类对象,则列表 包含其属性的名称,以及 其基础的属性。否则,列表将包含对象的 属性的名称、其类属性的名称,以及 递归地调用其类基类的属性

所以基本上,
dir
只打印传入参数的属性,而不是它对应的值


另外,它在解释差异方面相当全面。

@aruistante这里的问题基本上是关于
vars()
text
响应
类具有的其他属性。好的,这就是技术原因。但是为什么
response.text
是属性而
response.status\u code
不是属性呢?它们似乎应该属于同一类别。@wisbucky这个问题是为请求的设计者提出的。从源代码中可以得到的是,
status\u code
是一个实例变量,因为它是在构造函数
\uu init\uu
中初始化的,而
text
是一个类
@property
。这可能是因为构造文本需要更多的逻辑,而不仅仅是计算值……啊,谢谢,您解释了关键:
text
是类属性,而不是类属性。查看源代码,这是因为
text
不仅仅是一个简单的变量,它是一个执行一些附加逻辑的属性。
In [1]: import requests

In [2]: response = requests.get('http://httpbin.org/get')

In [3]: 'text' in vars(response)
Out[3]: False

In [4]: 'text' in dir(response)
Out[4]: True