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

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

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

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

Q&A

解決済

1回答

41439閲覧

super().__init__()が何しているのか分からない

kalon

総合スコア198

Python

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

0グッド

3クリップ

投稿2017/07/23 12:46

皆様いつもお世話になっております。

クラスの継承を勉強中なのですが

python

1class Prism: 2 def __init__(self, width, height, depth, unit='cm'): 3 self.width = width 4 self.height = height 5 self.depth = depth 6 self.unit = unit 7 8 def content(self): 9 return self.width * self.height * self.depth 10 11 def unit_content(self): 12 return str(self.content()) + self.unit 13 14 15p = Prism(20, 20, 20) 16print(str(p.content()) + ' is Prism') 17print(p.unit_content()) 18 19 20class Cube(Prism): 21 def __init__(self, length): 22 super().__init__(length, length, length) #<--これが何をしているのか理解できません 23 self.width = self.height = self.depth = length 24 25 26c = Cube(10) 27print(str(c.content()) + ' is Cube') 28print(c.unit_content()) 29

Prismクラスの

python

1__init__(self, width, height, depth, unit='cm')

をCubeクラスの中に呼び出しているだけでしょうか?

ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

super() は親クラスを示すためのメソッドです。

ですので super().__init__() は Prism クラスの __init__ メソッドを実行しているだけです。

__init__() メソッドは親クラスの Prism でも、子クラスでの Cube でも定義されています。このような場合、子クラスのものが勝ち、上書きされます。これをオーバーライドと言います。でも、親クラスのメソッドや変数を呼んだり参照したいケースもでてきます。そのときに使うのが super() です。

今回のコードでもそうですが、super().__init__() で親クラスのコンストラクタを実行しつつ、追加処理を行うといったチョイ足しのときに使う場合が多いです。

投稿2017/07/23 13:19

編集2017/07/23 13:27
miyahan

総合スコア3095

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

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

kalon

2017/07/23 13:24

回答ありがとうございます。 Prismクラスではdef __init__(self, width, height, depth, unit='cm')となっていますが、 Cubeクラスでsuper()をするときにsuper().__init__(length, length, length)とlengthを入力しているのは何故でしょうか?
miyahan

2017/07/23 13:33 編集

それはこのプログラムの目的・用途にかかわる部分ですので、コードを書いた人に聞いて下さい。 クラス名から察するに、立方体(正六面体)だからすべての辺の長さが同じという算数的な意味だと思いますが・・・。
kalon

2017/07/23 14:35

立方体(正六面体)を計算するコードで間違いありません。 Prismクラスで__init__(self, width, height, depth, unit='cm')引数が4つなので Cubeクラスではsuper().__init__(length, length, length, unit='cm')でないといけない気がするのですが、 unit='cm'は省略して良いのでしょうか?
miyahan

2017/07/23 17:19

unit='cm' のように引数に値を代入している形式を、デフォルト引数 とか デフォルト値つき引数 と呼びます。デフォルト引数は省略が可能で、略した場合は代入している値が引数として使われます。つまり今回のケースでは、省略しているので 'cm' が引数として渡されます。
kalon

2017/07/23 21:44

よく分かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問