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

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

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

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

Q&A

解決済

2回答

2851閲覧

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

evanstera

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2017/11/17 05:53

編集2017/11/17 06:01

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関係をサンプルを用いて解説してくれる方がいらっしゃると嬉しいです.
よろしくお願い致します.

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

Python

1class Creature(object): 2 def __init__(self): 3 self.attr = '食事する' 4 def printAttr(self): 5 print('生物は' + self.attr) 6 7class Dog(Creature): 8 def __init__(self): 9 super().__init__() 10 self.have = '尻尾' 11 def printHave(self): 12 print('犬には' + self.have + 'がある') 13 14class Chihuahua(Dog): 15 def __init__(self): 16 super().__init__() 17 self.skill = 'お座り' 18 def printSkill(self): 19 print('チワワの特技は' + self.skill) 20 21def main(): 22 dog = Chihuahua() 23 dog.printSkill() 24 dog.printHave() 25 dog.printAttr() 26 27if __name__ == '__main__': 28 main() 29 30"""実行結果 31チワワの特技はお座り 32犬には尻尾がある 33生物は食事する 34"""

ちょっとした実験コード

Python

1def my_dir(instance): 2 """プライベートでないdir""" 3 return [elem for elem in dir(instance) if elem[:2] != '__'] 4 5class Creature(object): 6 def __init__(self): 7 self.attr = '食事する' 8 def printAttr(self): 9 print('生物は' + self.attr) 10 11class Dog(Creature): 12 def __init__(self): 13 self.have = '尻尾' 14 def printHave(self): 15 print('犬には' + self.have + 'がある') 16 17class Chihuahua(Dog): 18 def __init__(self): 19 self.skill = 'お座り' 20 def printSkill(self): 21 print('チワワの特技は' + self.skill) 22 23def main(): 24 print(my_dir(object())) 25 print(my_dir(Creature())) 26 print(my_dir(Dog())) 27 print(my_dir(Chihuahua())) 28 29if __name__ == '__main__': 30 main() 31 32"""実行結果 33[] 34['attr', 'printAttr'] 35['have', 'printAttr', 'printHave'] 36['printAttr', 'printHave', 'printSkill', 'skill'] 37"""

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

投稿2017/11/17 06:01

編集2017/11/17 06:28
LouiS0616

総合スコア35660

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

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

evanstera

2017/11/17 09:38

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

0

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 08:44

Udomomo

総合スコア1524

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

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

evanstera

2017/11/17 09:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問