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

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

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

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

Q&A

解決済

2回答

220閲覧

クラスの機能を引き継げない

gunmed

総合スコア55

Python 3.x

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

0グッド

0クリップ

投稿2019/01/09 07:45

編集2019/01/09 08:41

クラスの機能を引き継ぎたい

クラスの機能を引き継ぐという練習していました。

class Person: def __init__(self, name, height, weight): self.name = name self.height = height self.weight = weight def bmi(self): result = self.weight / (self.height * self.height) print(self.name,'のBMIは', result,'です。')

というファイルをまず作成し、myclass.pyで保存したのち、別フォルダに

class BusinessPerson(Person): def __init__(self, name, height, weight, title): super().__init__(name, height, weight) self.title = title def work(self): print(self.title, 'の', self.name,'は働いていてる。')

とファイルを作成し、myclass.pyで保存しました。

###作成したコード

python3

1import myclass 2 3bp = myclass.BusinessPerson('モミジ', 1.26, 24, 'freshman') 4bp.bmi() 5bp.work() 6 7

以上のようにコードを作成し実行しても、以下のようなエラーが表示されます。

表示されるエラー

class BusinessPerson( Person): NameError: name 'Person' is not defined

スペルや文法ミスを探しても見つからないので、教えていただけると助かります。
よろしくお願いします、

イメージ説明
ファイル構造をスクショしました。
一番下の方の1002に1つ目のmyclass.py、1003に2つ目のmyclass.pyを保存し、1003のclass.client.pyにコードを書き実行しました。

###変更してやってみた
ここで以下のように1002に保存してあった1つ目のmyclass.pyの名称をmyclass2.pyとして切り取り、1003に移動しました。
1003に保存してあった2つ目のmyclass.pyの名称をmyclass3.pyに変更して、

python3

1import myclass3 2 3bp = myclass3.BusinessPerson('モミジ', 1.26, 24, 'freshman') 4bp.bmi() 5bp.work() 6

class.client.pyを実行したのですが、結果は変わりませんでした。
イメージ説明
ややこしくてすみません。よろしくお願いします。

maciOS 10.14.1
visual studio code

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

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

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

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

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

quickquip

2019/01/09 07:47

作成したファイルを格納したフォルダの構成と、実行しているファイルの場所が大事。
azuapricot

2019/01/09 07:50

↑の人の通りで BusinessPersonで呼び出してる元のクラスの Personなんてしらねーぞーっていうエラーなのでファイル構造のスクリーンショットなどをご提示ください~
gunmed

2019/01/09 08:42

回答ありがとうございます。変更してみました。よろしくお願いします。
guest

回答2

0

ベストアンサー

myclass.pyモジュール検索パスに記載されているルールおよび場所から検索されますが、見つからないとimportできません。
一番単純な解決策は3つのファイルをすべて同じ場所に配置することです。
この場合、重複しているmyclass.pyファイル名はどちらか変更する必要があります。

追記

書いてみました。なおファイル名は分かりやすいように書き換えました。

Python

1# persion.py 2class Person: 3 def __init__(self, name, height, weight): 4 self.name = name 5 self.height = height 6 self.weight = weight 7 8 def bmi(self): 9 print(self.weight / self.height / self.height)

Python

1# buisiness_persion.py 2from person import Person 3class BusinessPerson(Person): 4 def __init__(self, name, height, weight, title): 5 super().__init__(name, height, weight) 6 self.title = title 7 8 def work(self): 9 print(self.title, 'の', self.name,'は働いていてる。')

Python

1# client.py 2from buisiness_persion import BusinessPerson 3bp = BusinessPerson('モミジ', 1.26, 24, 'freshman') 4bp.bmi() 5bp.work()

実行結果

15.11715797430083 freshman の モミジ は働いていてる。

投稿2019/01/09 07:53

編集2019/01/09 08:55
can110

総合スコア38266

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

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

gunmed

2019/01/09 08:43

とりあえず頂いたアドバイス通り、ファイルを同じ場所にして、名称を変えてみましたが、なかなかうまくいきません。質問内容を変更したので、何かわかることがあれば教えていただけると幸いです。
gunmed

2019/01/09 09:35

素早い回答を丁寧にありがとうございました。解決しましたので、ベストアンサーにしたいと思います。
guest

0

やりたいことに対して作業内容がややこしすぎるような・・・

  • 3つもファイルを作ると互いにどうimportするかで(この質問のように)ハマりがち
  • 別フォルダに同名のファイルとして置くとimportがややこしくなる

単に1つのファイルにまとめて書くんじゃ駄目ですか。


直接のエラー原因は(若干憶測含みですが)2つめのmyclass.pyがもう一方のmyclass.py(の中のPersonクラス)をimportしないといけないのに、それを書いていないことです。

ディレクトリ構造がわからないとアドバイスのしようがないので、とりあえずこれ以上のことは書かないでおきます。

投稿2019/01/09 07:54

編集2019/01/09 07:57
hayataka2049

総合スコア30933

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

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

gunmed

2019/01/09 08:51

初プログラミングで1冊目の入門書の指示通りに勉強しているので、hayataka2049さんがおっしゃってる通り、1つのファイルにまとめて書くのがいいと思いますが、クラスの機能を引き継ぐという練習でやっているという体でお願いします、、、。 ディレクトリ構造というのかわからないですが、ファイルの構造をスクショしてみたので、参照していただき、何かあれば教えていただけるとありがたいです。 ちなみに、myclass3.pyのコード文頭に import myclass2 を追加して実行してみたのですが、同じ結果になってしまいました、、、
hayataka2049

2019/01/09 08:59

class BusinessPerson(Person): を定義しているファイルでPersonを参照するために、 from Personを定義しているモジュール import Person を書く必要があります。 ファイル移動後のディレクトリ構成なら、myclass3.pyの先頭にfrom myclass2 import Personで通るかな?
gunmed

2019/01/09 09:34

はい、それで通ることができました。ありがとうございました。 もう一人の方の方でもできてしまったので、ベストアンサーを決めかねました。そこで、公正に時間が早かったもう一人の方をベストアンサーにしようと思います。気分を害してしまったらすみません。わかりやすい回答でしたので、また機会があればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問