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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

11024閲覧

python(django)の__init__で使われる【*args, **kwargs】について

gkan

総合スコア3

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/10/20 05:52

編集2020/10/20 07:43

djangoのサンプルなどで勉強を進めているのですが、form.pyなどのClassで初期処理として

def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)

と記載されることが多いですが、*argsのタプル型と**kwargsの辞書型が必要となる理由が、調べたのですがよくわかりません。
forms.Formを継承してクラスを作成した場合の__init__では、selfのみでダメなのはなぜでしょうか?

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

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

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

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

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

guest

回答1

0

Pythonはメソッドに、引数を渡したり、キーワード引数で引数を渡す、という事は、基本的な事で習ったかと思います。

python

1def func(hoge, piyo): 2 print('hoge = %s, piyo = %s.' % (repr(hoge), repr(piyo))) 3func(1, 2) 4# hoge = 1, piyo = 2. 5func(hoge=3, piyo=4) 6# hoge = 3, piyo = 4.

メソッドの受け側で、「*args」として受け取ると引数をタプルとして、「**kwargs」として受け取るとキーワード引数を辞書として受け取る事ができます。
(「args」「kwargs」の名前は、何でもいいです。「*」が重要です。)

python

1def func(*args): 2 print('args = %s.' % repr(args)) 3func(1, 2) 4# args = (1, 2). 5def func(**kwargs): 6 print('kwargs = %s.' % repr(kwargs)) 7func(hoge=3, piyo=4) 8# kwargs = {'hoge': 3, 'piyo': 4}.

同じようにメソッドの呼び側で「*」一つを付けてタプル(もしくはリストなどのシーケンス)を渡すとその内容が引数として渡され、「**」を付けて辞書を渡すとその内容がキーワード引数として渡されます。

python

1def func(hoge, piyo): 2 print('hoge = %s, piyo = %s.' % (repr(hoge), repr(piyo))) 3a = 1, 2 4func(*a) 5# hoge = 1, piyo = 2. 6b = { 'hoge': 3, 'piyo': 4 } 7func(**b) 8# hoge = 3, piyo = 4.

これらをまとめて、引数に「*args, **kwargs」と受け取って、「*args, **kwargs」で他のメソッドに渡すという事は、受け取った引数をそっくりそのまま他のメソッドに渡すことになります。
Pythonのメソッド引数は先も言ったとおり比較的自由に記述できますが、このように書いておけば呼び側でどんな引数の渡し方をしても対応できるようになります。

投稿2020/10/20 12:18

編集2020/10/20 12:24
katsuko

総合スコア3538

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

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

gkan

2020/10/21 09:59

回答、ありがとうございます! djangoのform.pyでclassを作成した時に記載する、【def __init__(self, *args, **kwargs)】は、formをview.pyなどで 【from .forms import InquiryForm】 として準備し、 url.pyから呼ばれたclassの中で、【form_class = InquiryForm】などととする時にform.py側のclassで【*args, **kwargs】を記載することでパラメータの受け渡しを可能とする意味になるということでしょうか。
katsuko

2020/10/21 11:51

私はdjangoは知りませんので、djangoに関する話はお応えできません。 一応今回の話はdjango関係なくpythonの話なので回答しましたが、「受け取った引数をそのまま他のメソッドに渡す」ではご理解していただけなかったでしょうか。
gkan

2020/10/24 05:18

質問の仕方が悪く、申し訳ありません。 この場合、djangoのFormを継承した時に必要となる理由がわかりませんでした。 pythonのコンストラクタは、参考にした資料では【第一引数「self」は、オブジェクト自身を指します。Python の慣習として名前は「self」で指定します。「self」は呼び出し側では指定不要です。呼び出し側は引数2以降を指定します。なお、引数2以降は省略可能です。】とありました。 ですが、 from django import forms class InquiryForm(forms.Form): name = forms.CharField(label='お名前', max_length=30) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) のケースでは第2引数以降を省略することができません。その理由が理解できませんでした・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問