我想知道模块在Python中是如何工作的。例如我有这个代码
import requests
r = requests.get("http://www.google.com")
print r.status_code
现在根据我的理解,requests模块应该有一个python文件,它包含一个名为“get”的类,而在“get”类中必须有一个名为“status_code”的成员变量 所以当我创建对象“r”时,我得到它的变量status_code。
然而,当我查看包中的所有文件时,我找不到任何名为“get”的类。 然而,我可以在名为“response”的类下找到一个名为“get”的函数。但由于我们没有将对象创建为“响应”类的实例,我们如何才能访问其中的“get”函数?
我想我在这里错过了一个关键概念,有人可以为我指出它吗?
由于
答案 0 :(得分:4)
执行import requests
文件__init__.py
时,如果您在案例中检查该文件,则会找到以下行:
from .api import request, get, head, post, patch, put, delete, options
这意味着从api.py
导入get()
功能:
def get(url, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('get', url, **kwargs)
正如您所看到的那样,它调用来自api.py
的请求函数,如下所示:
def request(method, url, **kwargs):
session = sessions.Session()
return session.request(method=method, url=url, **kwargs)
这会在Session
中创建一个对象session.py
,然后调用其方法request
。此方法将调用方法send()
,该方法返回Response
对象,该对象在Response
内的类models.py
中定义(我复制第一行):
class Response(object):
def __init__(self):
super(Response, self).__init__()
self._content = False
self._content_consumed = False
#: Integer Code of responded HTTP Status.
self.status_code = None
...
以下是定义status_code
的位置,因此当您调用r = requests.get("http://www.google.com")
时,您正在检索此对象,然后您可以访问status_code
答案 1 :(得分:2)
您的理解并不完全正确。
requests
模块是一个对象;然后.get
是对该对象的属性查找;它必须是可调用的对象,因为您尝试使用(...)
语法调用它。这意味着它可以是一个类,一个函数或任何其他具有__call__
方法的对象。
那个可调用的东西会返回;所有的callables。对于类,通常会返回一个实例,但对于可以是任何 Python对象的函数。无论.get()
做什么,它都会返回一个具有.status_code
属性的对象,或具有.__getattr__
方法,该方法在使用名称{{1}调用时返回一些内容}。
在此特定情况下,get()
is a function已导入status_code
包初始化模块。此函数间接创建Session()
instance,并在该实例上调用.request()
method。该方法最终会返回Response
instance,其中有.status_code
attribute。