質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

769閲覧

superの扱い方の確認

chapin

総合スコア80

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/06/25 12:52

クラスを継承する際に使われる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()を使うタイミングが変わってしまうという認識でよろしいでしょうか?
どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

親クラスで定義されたメソッドでインスタンス自らを処理したい、というケースで出てきますので、使い方はいろいろあると思います。

あえて2種類に分けて考える必要性はそんなにないと思います。べつにいつでも使えます。

投稿2019/06/25 12:59

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapin

2019/06/25 13:35

あまり使い方を決め込まないで柔軟に対応せよ、ということでしょうか。 アドバイスありがとうございます。
hayataka2049

2019/06/25 13:45

大事なのは実際に何をしているのかで、要はオーバーライドしてしまったメソッドのオーバーライド前のものを呼び出せるということですから。そんなに難しく考える必要はないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問