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

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

ただいまの
回答率

90.34%

  • Python

    9206questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 279

TON-B

score 12

 前提・実現したいこと

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

 該当のソースコード

class Pokemon:
    def __init__(self,name,hp,pw,de,spp,spd,spe):
        self.name=name
        self.hp=hp
        self.pw=pw
        self.de=de
        self.spp=spp
        self.spd=spd
        self.spe=spe

    def open(self):
        return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+"、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+"、素早さは"+str(self.spe)+"である。"


pokemon1=Pokemon("ミュウ",100,100,100,100,100,100)
print(pokemon1.open())


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

class Pokemon2(Pokemon):
    def __init__(self,type,type2):
        self.type=type
        self.type2=type2

    def open2(self):
        return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+\
    "、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+\
    "、素早さは"+str(self.spe)+"である。"+"第1タイプは"+self.type+\
    "第2タイプは"+self.type2+"である。"

pokemon2=Pokemon2("ミュウ2",100,100,100,100,100,100,"エスパー","なし")
print(pokemon2.open())

 目標物

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

class Pokemon:
    def __init__(self,name,hp,pw,de,spp,spd,spe):
        self.name=name
        self.hp=hp
        self.pw=pw
        self.de=de
        self.spp=spp
        self.spd=spd
        self.spe=spe

    def open(self):
        return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+"、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+"、素早さは"+str(self.spe)+"である。"

class Pokemon2(Pokemon):
    def __init__(self,name,hp,pw,de,spp,spd,spe,type,type2):
        super(Pokemon2, self).__init__(name,hp,pw,de,spp,spd,spe)
        self.type=type
        self.type2=type2

    def open2(self):
        return self.name+"の能力:"+"HPは"+str(self.hp)+"、攻撃は"+str(self.pw)+\
    "、防御は"+str(self.de)+"、特功は"+str(self.spp)+"、特防は"+str(self.spd)+\
    "、素早さは"+str(self.spe)+"である。"+"第1タイプは"+self.type+\
    "第2タイプは"+self.type2+"である。"


pokemon1=Pokemon("ミュウ",100,100,100,100,100,100)
print(pokemon1.open())

pokemon2=Pokemon2("ミュウ2",100,100,100,100,100,100,"エスパー","なし")
print(pokemon2.open2())

このコードの

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


については

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


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

 追記

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

# format関数(index指定)
return "{0}の能力:HPは{1}、攻撃は{2}、防御は{3}、特功は{4}、特防は{5}、素早さは{6}である。第1タイプは{7}、第2タイプは{8}である。".format(
    self.name,self.hp,self.pw,self.de,
    self.spp,self.spd,self.spe,
    self.type,self.type2)

# format関数(キーワード引数指定)
return "{name}の能力:HPは{hp}、攻撃は{pw}、防御は{de}、特功は{spp}、特防は{spd}、素早さは{spe}である。第1タイプは{type1}、第2タイプは{type2}である。".format(
    name=self.name,hp=self.hp,pw=self.pw,de=self.de,
    spp=self.spp,spd=self.spd,spe=self.spe,
    type1=self.type,type2=self.type2)

# f-strings(python3.6以降でのみ使える機能)
return 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 22:29

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

    キャンセル

  • 2018/06/30 22:47 編集

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

    キャンセル

  • 2018/06/30 22: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)

    このような形でしょうかね。書く労力が減りました。

    キャンセル

  • 2018/06/30 22:52 編集

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

    キャンセル

  • 2018/06/30 22:53

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

    キャンセル

  • 2018/06/30 23:07

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

    キャンセル

  • 2018/07/02 20: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を親クラスから引っ張ってきているだけなのでしょうか?

    キャンセル

  • 2018/07/02 20:44

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9206questions

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