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

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

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

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

Q&A

解決済

1回答

1278閲覧

【Python】クラスの継承について

TON-B

総合スコア21

Python

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

0グッド

0クリップ

投稿2018/06/30 12:40

前提・実現したいこと

・Python
・継承
・super().の使い方
・作成したクラスへの属性の追加

該当のソースコード

Python

1class Pokemon: 2 def __init__(self,name,hp,pw,de,spp,spd,spe): 3 self.name=name 4 self.hp=hp 5 self.pw=pw 6 self.de=de 7 self.spp=spp 8 self.spd=spd 9 self.spe=spe 10 11 def open(self): 12 return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+"、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+"、素早さは"+str(self.spe)+"である。" 13 14 15pokemon1=Pokemon("ミュウ",100,100,100,100,100,100) 16print(pokemon1.open()) 17

上記のコードに属性の追加・追加したものの出力をしたい。

Python

1class Pokemon2(Pokemon): 2 def __init__(self,type,type2): 3 self.type=type 4 self.type2=type2 5 6 def open2(self): 7 return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+\ 8 "、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+\ 9 "、素早さは"+str(self.spe)+"である。"+"第1タイプは"+self.type+\ 10 "第2タイプは"+self.type2+"である。" 11 12pokemon2=Pokemon2("ミュウ2",100,100,100,100,100,100,"エスパー","なし") 13print(pokemon2.open()) 14 15

目標物

ミュウの能力:HPは100、攻撃は100、防御は100、特功は100、特防は100、素早さは100である。第1タイプはエスパー、第2タイプはなしである。

Pokemonを親クラスに、Pokemon2を子クラスにして上記を出力したい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

元のコードにできるだけ手を加えないでやってみました。

python

1class Pokemon: 2 def __init__(self,name,hp,pw,de,spp,spd,spe): 3 self.name=name 4 self.hp=hp 5 self.pw=pw 6 self.de=de 7 self.spp=spp 8 self.spd=spd 9 self.spe=spe 10 11 def open(self): 12 return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+"、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+"、素早さは"+str(self.spe)+"である。" 13 14class Pokemon2(Pokemon): 15 def __init__(self,name,hp,pw,de,spp,spd,spe,type,type2): 16 super(Pokemon2, self).__init__(name,hp,pw,de,spp,spd,spe) 17 self.type=type 18 self.type2=type2 19 20 def open2(self): 21 return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+\ 22 "、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+\ 23 "、素早さは"+str(self.spe)+"である。"+"第1タイプは"+self.type+\ 24 "第2タイプは"+self.type2+"である。" 25 26 27pokemon1=Pokemon("ミュウ",100,100,100,100,100,100) 28print(pokemon1.open()) 29 30pokemon2=Pokemon2("ミュウ2",100,100,100,100,100,100,"エスパー","なし") 31print(pokemon2.open2()) 32

このコードの

python

1super(Pokemon2, self).__init__(name,hp,pw,de,spp,spd,spe)

については

python

1Pokemon.__init__(self,name,hp,pw,de,spp,spd,spe)

の方が直感的かもしれません(結果は同じ)。

追記

文字列の組み立て方については、

python

1# format関数(index指定) 2return "{0}の能力:HPは{1}、攻撃は{2}、防御は{3}、特功は{4}、特防は{5}、素早さは{6}である。第1タイプは{7}、第2タイプは{8}である。".format( 3 self.name,self.hp,self.pw,self.de, 4 self.spp,self.spd,self.spe, 5 self.type,self.type2) 6 7# format関数(キーワード引数指定) 8return "{name}の能力:HPは{hp}、攻撃は{pw}、防御は{de}、特功は{spp}、特防は{spd}、素早さは{spe}である。第1タイプは{type1}、第2タイプは{type2}である。".format( 9 name=self.name,hp=self.hp,pw=self.pw,de=self.de, 10 spp=self.spp,spd=self.spd,spe=self.spe, 11 type1=self.type,type2=self.type2) 12 13# f-strings(python3.6以降でのみ使える機能) 14return f"{self.name}の能力:HPは{self.hp}、攻撃は{self.pw}、防御は{self.de}、特功は{self.spp}、特防は{self.spd}、素早さは{self.spe}である。第1タイプは{self.type}、第2タイプは{self.type2}である。"

投稿2018/06/30 13:13

編集2018/06/30 13:59
hayataka2049

総合スコア30933

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

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

wakame

2018/06/30 13:29

文字列変換がいちいち面倒なのでformat関数を使いたいですね。
hayataka2049

2018/06/30 13:48 編集

同感です。f-stringsだともっと楽かも
TON-B

2018/06/30 13:48

return "{1}の能力:HPは{2}、攻撃は{3}、防御は{4}、特功は{5}、特防は{6}、素早さは{7}である。第1タイプは{8}、第2タイプは{9}である。".format(self.name,self.hp,self.pw,self.de,self.spp,self.spd,self.spe,self.type,self.type2) このような形でしょうかね。書く労力が減りました。
hayataka2049

2018/06/30 13:52 編集

indexは0から始まります。それと、その書き方だとちょっと順番が狂っただけで地獄なので、対策が色々思いつきます(回答文に追記します)
TON-B

2018/06/30 13:53

hayataka2049さんご回答ありがとうございます。追記もありがとうございます。 super()の使い方がいまいちわからなかったのですが、「super(子クラス,self).親クラスのメゾット」で属性を引き継げるという認識でよろしいのでしょうかね。
hayataka2049

2018/06/30 14:07

引き継げるというか、selfを親クラスのメソッドに委ねるというか(Pokemon.__init__の方は本当にそのままの書き方だけと)、ちょっとどう説明して良いのかわかりませんが結果的にはそうなります
TON-B

2018/07/02 11:25

super().の理解がしきれていないんですよね。 例えば、質問のコードを簡略化した ```Python class Pokemon: def __init__(self,name): self.name=name def print_act(self): return self.name+"毛並みのいいポケモンだ。" class Pokemon2(Pokemon): def __init__(self,name,power): super(Pokemon2,self).__init__(name) self.power=power def print_act2(self): return "{0}は毛並みのいいポケモンだ。おまけに攻撃が{1}もある!".format(self.name,self.power) pokemon1=Pokemon2("ピカチュウ",50) print(pokemon1.print_act2()) ``` においてPokemon2クラスはPokemonクラスの属性nameを引き継いでいます。 が、ベストアンサーを参考に書いただけであって super(Pokemon2,self).__init__(name) この部分がどういった働きをするのかピンときません。 単にnameを親クラスから引っ張ってきているだけなのでしょうか?
hayataka2049

2018/07/02 11:44

親クラスの__init__を使って子クラスのインスタンスを生成している訳ですねー Pokemon.__init__(self,name,hp,pw,de,spp,spd,spe) の方が直感的かもしれないというのはそういう意味です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問