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