クラスを継承する際に使われるsuper()について質問いたします。
クラス継承時にsuper()を使うことがありますが、このタイミングについてずっと腑に落ちずにおりました。タイミングについては自分が知っているのは2パターンあります。
このタイミングについて自分の認識が誤っていないか確認させてください。
<メソッド定義最初に呼び出すパターン>
例一 https://teratail.com/questions/85379
python
1class Cube(Prism): 2 def __init__(self, length): 3 super().__init__(length, length, length) #<--これが何をしているのか理解できません 4 self.width = self.height = self.depth = length
例二 https://teratail.com/questions/173394
python
1def get_context_data(self, **kwargs): 2 context = super().get_context_data(**kwargs)
<メソッド定義のリターン値として呼び出すパターン>
例 https://stackoverflow.com/questions/27824181/django-a-class-based-view-with-mixins-and-dispatch-method
python
1class SuperOrManagerPermissionsMixin(AccessMixin): 2 def dispatch(self, request, *args, **kwargs): 3 if self.user_has_permissions(request): 4 return super(SuperOrManagerPermissionsMixin, self).dispatch( 5 request, *args, **kwargs) 6 else: 7 return self.handle_no_permission(request) 8
両パターンの共通点は、親クラスメソッドを実行と、何らかの処理を加えたい、という動機があること。
パターン前者は、親メソッドで作られたオブジェクトに他の要素を加えたり、その要素を加工したいときに使われる。
※例二であれば、contextは辞書型データなので、このcontextにいろんな要素を加えていくように使うことが見込まれています。
パターン後者は、親メソッドのリターン値が一連の何らかを構成する関数やメソッドの一部であり、パターン前者のようにsuper()を呼び出してから何らかの処理を加えると一連の流れが断裂してしまう。そのために追加の処理を親メソッド実行前に差し込む形で使われる。
※本来のdispatchメソッドはreturn値としてhandler(request, *args, **kwargs)という形でメソッドを呼び出します。
こんなような背景があってsuper()を使うタイミングが変わってしまうという認識でよろしいでしょうか?
どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/25 13:35
2019/06/25 13:45