为什么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