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

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

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

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

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

Q&A

解決済

1回答

2547閲覧

メソッドの中でのsuper()の使い方がよくわからない

chgrios

総合スコア70

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

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

0グッド

0クリップ

投稿2019/08/04 07:34

前提・実現したいこと

クラスの引継ぎにsuper()が使われることがわかったのですが、クラス関数内で次のようにsuper()を使っているプログラムが書籍に書いてありました。

python

1class conv2DBatchNormRelu(nn.Module): 2 def __init__(self, in_channels, 3 out_channels, kernel_size, stride, padding): 4 super(conv2DBatchNormRelu, self).__init__() 5 self.conv = nn.Coonv2d(in_channels, out_channels, 6 kernel_size, stride, padding)

上のようにsuper()を使わないで下のようにも書けるような気がします。

python

1class conv2DBatchNormRelu(nn.Module): 2 def __init__(self, in_channels, 3 out_channels, kernel_size, stride, padding): 4 #super(conv2DBatchNormRelu, self).__init__() 5 self.conv = nn.Coonv2d(in_channels, out_channels, 6 kernel_size, stride, padding)

その辺りsuper()の意義やなぜ便利なのかなど教えて頂けると嬉しいです。
それとsuper()などをteratail内で関数表記する方法を教えて欲しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

継承元として初期化したあと、独自の処理をつけたすという意図なので、これは必要なのです。

単純な例で、

python

1class Hoge: 2 def __init__(self): 3 self.hoge = "hoge" 4 5class Fuga(Hoge): 6 def __init__(self): 7 super(Fuga, self).__init__() 8 self.fuga = "fuga" 9 10f = Fuga() 11print(f.hoge) 12print(f.fuga)

とするとfに代入されたFugaクラスのインスタンスは属性hogefugaの両方持ちます。super(Fuga, self).__init__()をなくしてしまうと、__init__がオーバーライドされるので、親の__init__が実行されなくなります。

表記は``で囲んでください。

投稿2019/08/04 07:50

hayataka2049

総合スコア30933

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

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

chgrios

2019/08/04 08:22

この場合`` super(Fuga, self).__init__() `` をFugaメソッドの中に入れることで、f=Fuga()とした時にオーバーライドが回避されfugaが代入されるということでよろしいでしょうか? 表記の件わかったのですが、半角''で入力しても反映されず、いちいちコピーする必要があるのしょうか?
hayataka2049

2019/08/04 08:23

バッククオートだからSHIFT-@で入力してくださいね。あとコメント欄では(他のmarkdown含めて)効きません。
hayataka2049

2019/08/04 08:25 編集

オーバーライドは回避されない(__init__に同名でかぶせている時点で)のですが、継承されたクラスの__init__を呼ぶ手段としてsuperが使えるという話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問