class内での「self.変数」と「変数」の違いについて

投稿者: Anonymous

djangoのDetailViewをつかわずその機能が書かれた以下のコードがありました。

class TopicTemplateView_InsteadOfDetailView(TemplateView):
    template_name = 'thread/detail_topic.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['topic'] = get_object_or_404(Topic, id=self.kwargs.get('pk', ''))

        return context

気になったラインが一行あって、

    context['topic'] = get_object_or_404(Topic, id=self.kwargs.get('pk', ''))

このラインは,selfがついていてなぜセルフが必要なのか、絶対必要なのかと思い、selfなしをプリントしてみたところ、どちらも同じ結果を返しました。
(pkの値を位置を与えたときは、どちらも1が返ってきた。)

    print(kwargs.get('pk',''))      # 1 
    print(self.kwargs.get('pk','')) # 1

self.kwargs, kwargs ともにdictオブジェクトでした。

クラス内では、変数宣言するときに self.変数 = 値 としますが、変数 = 値 とでは何が違うのでしょうか?

解決

インスタンス変数self.kwargsはsetupメソッドの中で作成されていて、setupはas_viewメソッドが返す関数の中で呼ばれます
アクセスがあると、dispatchされて、getattrで探し出されて、TemplateViewのgetが呼び出されます。

TemplateViewのgetは

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

こうです。

ここでget_context_dataが呼び出されて、質問のget_context_dataが実行されるので、その時点でkwargsとself.kwargsはオブジェクトとして等しいものを指していると思います。
(実行して確認はしてません。悪しからず)

私は”self.kwargsとする方が紛らわしい”という感想を持ちました。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *