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

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

ただいまの
回答率

90.52%

  • Python 3.x

    6342questions

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

クラスの継承が理解できません

解決済

回答 2

投稿 編集

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

evanstera

score 4

Python3を使っています.
クラスの継承がいまいち理解できず,エラーに悩まされています.
クラスの親子関係がよくわかりません.
以下の課題で困っています.
<課題>

以下の知識をもつフレームネットワークがある.
・犬は生物である
・チワワは犬である
・生物は食事する
・犬には尻尾がある
・チワワの特技はお座り

課題1 「チワワの特技はお座り」と返答する
課題2 「チワワは食事をするか」,is-a関係を用いて「Yes」と返答させる.

私が書いたコード

class Creature(object):
    def __init__(self):
        self.attr = '食事する'
    def printAttr(self):
        print('生物は' + self.attr)

class Dog(Creature):
    def __init__(self):
        self.have = '尻尾'
    def printHave(self):
        print('犬には' + self.have + 'がある')

class Chihuahua(Dog):
    def __init__(self):
        self.skill = 'お座り'
    def printSkill(self):
        print('チワワの特技は' + self.skill)

def main():
    dog = Chihuahua()
    dog.printSkill() #課題1
    dog.printHave() #'Chihuahua' object has no attribute 'have'

if __name__ == '__main__':
    main()


課題1は「チワワの特技はお座り」と正しく出力されるのですが,printHaveはエラーが出ます.
また,課題2のis-a関係を用いて...のやり方がわかりません.

なんとなくオブジェクト指向というものはクラスによってオブジェクトに属性を付属していく
イメージなのですがこの書き方が正しいのかわかりません.

この課題通りでなくても,is-a関係をサンプルを用いて解説してくれる方がいらっしゃると嬉しいです.
よろしくお願い致します.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

このような場合、親クラスの__init__メソッドを明示的に呼び出さねばいけません。
インスタンス変数が継承されていないから(というか定義されていないから)です。

class Creature(object):
    def __init__(self):
        self.attr = '食事する'
    def printAttr(self):
        print('生物は' + self.attr)

class Dog(Creature):
    def __init__(self):
        super().__init__()
        self.have = '尻尾'
    def printHave(self):
        print('犬には' + self.have + 'がある')

class Chihuahua(Dog):
    def __init__(self):
        super().__init__()
        self.skill = 'お座り'
    def printSkill(self):
        print('チワワの特技は' + self.skill)

def main():
    dog = Chihuahua()
    dog.printSkill()
    dog.printHave()
    dog.printAttr()

if __name__ == '__main__':
    main()

"""実行結果
チワワの特技はお座り
犬には尻尾がある
生物は食事する
"""

ちょっとした実験コード

def my_dir(instance):
    """プライベートでないdir"""
    return [elem for elem in dir(instance) if elem[:2] != '__']

class Creature(object):
    def __init__(self):
        self.attr = '食事する'
    def printAttr(self):
        print('生物は' + self.attr)

class Dog(Creature):
    def __init__(self):
        self.have = '尻尾'
    def printHave(self):
        print('犬には' + self.have + 'がある')

class Chihuahua(Dog):
    def __init__(self):
        self.skill = 'お座り'
    def printSkill(self):
        print('チワワの特技は' + self.skill)

def main():
    print(my_dir(object()))
    print(my_dir(Creature()))
    print(my_dir(Dog()))
    print(my_dir(Chihuahua()))

if __name__ == '__main__':
    main()

"""実行結果
[]
['attr', 'printAttr']
['have', 'printAttr', 'printHave']
['printAttr', 'printHave', 'printSkill', 'skill']
"""

課題2に関しては、問題設定がちょっとよくわかりません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/17 18:38

    インスタンス変数の定義を明示する必要があるのですね.
    実験コードをみて納得しました.
    課題2は,私もピンと来なかったので自分でなんとかします.
    丁寧なご回答ありがとうございます.

    キャンセル

+3

is-a関係は、名前の通り A is a Bという関係です。AはBの具体例の一つ(インスタンス)なので、Bが持っている性質(メソッドやプロパティ)をすべてそのまま使うことができます。
例えば、square is a rectangle(正方形は四角形の一種です)という文章があったとします。そして、四角形の性質としていくつかのものが定義されたとします。このとき、定義された四角形の性質は、全て正方形にもあてはまるはずです。(あてはまらない性質があるのであれば、文章自体が間違っているということになってしまいます)

この問題でいうと、dog = Chihuahua() の部分がポイントです。dogはChihuahuaオブジェクトのインスタンスであり、dog is a Chihuahuaという関係が成り立っています。このため、Chihuahuaオブジェクトで定義されたメソッドやプロパティは、dogインスタンスでもそのまま使うことができます。

課題2の出題意図はよくわかりませんが、おそらくdogインスタンスからCreatureクラスのattrプロパティを使えるようにすれば良いのだと思います。(ChihuahuaクラスはCreatureクラスを継承しているので、dog is a creatureも成り立っています)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/17 18:40

    is-a関係の理解が深まりました.
    課題2もとりあえずCreatureを参照してみます.
    ご丁寧な解説ありがとうございます.

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    6342questions

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