模块如何在Python中运行?

时间:2013-08-07 10:23:57

标签: python module

我想知道模块在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”函数?

我想我在这里错过了一个关键概念,有人可以为我指出它吗?

由于

2 个答案:

答案 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