0

回答

(1)オブジェクト ( )
read()メソッドは、その属性のメソッドを呼び出します。つまり、独自のクラスのオブジェクトであり、独自のメソッドを持っています。(2)オブジェクト のメソッドとファイル オブジェクトのメソッドは必ずしも同じではありません。したがって、彼らは異なる議論を取るかもしれません。(3)サブクラスで設定する必要があります。(3) はい。より正確には、デコレーターは 、名前を参照するたびにメソッドが呼び出されることを意味します。/答えてくれたダニエル・ローズマンに感謝./質問HttpRequestselfread()_stream_streamread()


read()HttpRequest_stream
read()


self._stream


@property
self.body





HttpRequestDjangoのクラスのコードを調べています。

以下のコードによると、self.body()は を呼び出しself.read()、その戻り値を代入しようとしますself._body
例外がなければ、self._body で StringIO を呼び出し、その戻り値を self._stream に代入します。

関連する 4 つの質問があります:
(1)自身を呼び出しますか
? それとも、ファイル オブジェクトの read メソッドを呼び出しますか? (2) の定義に args と kwargs を含める理由は何ですか? (3) HttpRequest の定義で見つけたものについては、メソッドによって作成されます。が最初に呼び出されるとどう なりますか? おそらく、まだ作成されていません。 それを作成するには、最初に を作成する必要があります。self.read()self._stream


self.read


self._streamself.body
self.body()self._stream
self.body()self._body
self._body を作成するには、self.read() が呼び出されます。
しかし、s elf.read() calls .read() on self._stream
では、どこから self._stream を取得するのでしょうか?

(4)
self.body がプロパティであるにもかかわらず、self.body() メソッドが呼び出され、
その戻り値は、self.body を呼び出したときに得られるものです。私は正しいですか?

django.http.HttpRequest

class HttpRequest(object):

    #...

    def __init__(self):
        self.GET, self.POST, self.COOKIES, self.META, self.FILES = {}, {}, {}, {}, {}
        self.path = ''
        self.path_info = ''
        self.method = None
        self._post_parse_error = False

    #...

    @property
    def body(self):
        if not hasattr(self, '_body'):
            if self._read_started:
                raise Exception("You cannot access body after reading from request's data stream")
            try:
                self._body = self.read()
            except IOError, e:
                raise UnreadablePostError, e, sys.exc_traceback
            self._stream = StringIO(self._body)
        return self._body

    #...

    def read(self, *args, **kwargs):
        self._read_started = True
        return self._stream.read(*args, **kwargs)

    #...
4

1 に答える 1

0
  1. いいえ、read()オブジェクトself._streamが何であれメソッドを呼び出します。

  2. これは、任意の引数 (位置およびキーワード) をメソッドに渡すことができる通常のパターンです。この場合、ストリームの read メソッドに直接渡されます。

  3. そのコードの上のコメントは何が起こっているかを説明しています - self._stream はサブクラスによって設定されなければなりません。

  4. はい。デコレーターとは、@property単に名前を参照するだけでメソッドが呼び出されることを意味しself.bodyますself.body()

于 2013-02-26T19:50:24.760 に答える