3

モジュールがPythonで実際にどのように機能するのか疑問に思っていました.たとえば、私はこのコードを持っています

import requests
r = requests.get("http://www.google.com")
print r.status_code

私の理解によれば、リクエストモジュールには「get」というクラスを含むpythonファイルが必要であり、「get」クラス内には「status_code」というメンバー変数が必要です。オブジェクト「r」を作成すると、変数 status_code を取得します。

しかし、パッケージに同梱されているすべてのファイルを見てみると、「get」という名前のクラスは見つかりませんでした。ただし、「response」というクラスの下に「get」という関数を見つけることができました。しかし、オブジェクトを「response」クラスのインスタンスとして作成しなかったので、その中の「get」関数にアクセスするにはどうすればよいでしょうか?

ここで重要な概念が欠けていると思います。誰か指摘してもらえますか?

ありがとう

4

2 に答える 2

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のとおり、次のようなrequest 関数を呼び出します。

def request(method, url, **kwargs):
    session = sessions.Session()
    return session.request(method=method, url=url, **kwargs)

Session内部で定義されたオブジェクトを作成し、session.pyそのメソッドを呼び出しますrequest。このメソッドは、内部のクラスで定義されてsend()いるオブジェクトを返すメソッドを呼び出します(最初の行をコピーします)。ResponseResponsemodels.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

于 2013-08-07T10:41:46.007 に答える
2

あなたの理解は完全には正しくありません。

モジュールはrequestsオブジェクトです。.get次に、そのオブジェクトの属性ルックアップです。構文で呼び出そうとするため、呼び出し可能な(...)オブジェクトである必要があります。つまり、クラス、関数、または__call__メソッドを持つその他のオブジェクトにすることができます。

その callable は何かを返します。すべての呼び出し可能オブジェクトが行います。クラスの場合、通常はインスタンスが返されますが、関数の場合は任意のPython オブジェクトになります。何をするにしても、属性を持つオブジェクト、またはname で呼び出されたときに何かを返すメソッドを持つ.get()オブジェクトを返します。.status_code.__getattr__status_code

この特定のケースでは、パッケージ初期化モジュールにインポートされget()た functionです。requests/__init__.pyこの関数は、間接的にインスタンスを作成し、Session()そのインスタンスで.request()メソッドを呼び出します。そのメソッドは、最終的に、属性を持つResponseインスタンスを返します。.status_code

于 2013-08-07T10:31:53.730 に答える