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

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

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

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

Q&A

解決済

1回答

783閲覧

pythonのクラス内での関数の使い方

symon

総合スコア14

Python

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

0グッド

1クリップ

投稿2021/07/11 04:50

編集2021/07/11 04:52

前提・実現したいこと

Pythonでクラスの勉強をしていて、理由が分からず詰まってしまいました。

Testクラスをインスタンス化して、output()を実行すると以下の結果が返ってくることを実現したいです。

Python

1>>> Osadaは24歳です。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "***/test.py", line 25, in <module> test.output() File "c***/test.py", line 20, in output get_name() NameError: name 'get_name' is not defined

該当のソースコード

Python

1import datetime as dt 2 3class Test(): 4 def __init__(self, name, born_year): 5 self.name = name 6 self.born_year = born_year 7 self.age = 0 8 9 def get_name(self): 10 self.name = self.name + 'さん' 11 12 def get_age(self): 13 current_year = dt.date.today().year 14 self.age = current_year - self.born_year 15 16 def do_introdution(self): 17 print("{}は{}才です。".format(self.name, self.age)) 18 19 def output(self): 20 get_name() 21 get_age() 22 do_introdution() 23 24test = Test('Osada', 1997) 25test.output()

試したこと

main()を用いたパターンもできるようになりたくtryしてみましたが同様のエラーになってしまいました。

Python

1import datetime as dt 2 3class Test(): 4 def __init__(self, name, born_year): 5 self.name = name 6 self.born_year = born_year 7 self.age = 0 8 9 def main(): 10 get_name() 11 get_age() 12 do_introdution() 13 14 def get_name(self): 15 self.name = self.name + 'さん' 16 17 def get_age(self): 18 current_year = dt.date.today().year 19 self.age = current_year - self.born_year 20 21 def do_introdution(self): 22 print("{}は{}才です。".format(self.name, self.age)) 23 24 if __name__ == '__main__': 25 main() 26 27test = Test('Osada', 1997) 28test.main() 29 30>>> Traceback (most recent call last): 31 File "***/test.py", line 3, in <module> 32 class Test(): 33 File "***/test.py", line 25, in Test 34 main() 35 File "***/test.py", line 10, in main 36 get_name() 37NameError: name 'get_name' is not defined 38

補足情報(FW/ツールのバージョンなど)

python 3.7.9
windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数get_nameはオブジェクトTestのメソッドとして定義されているので、呼び出す際は...

python

1class Test(): 2 def output(self): 3 self.get_name()

このようにselfを頭につけてメソッドであることを示す必要があります。

投稿2021/07/11 05:08

編集2021/07/14 18:05
rtgsdfsdg

総合スコア174

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

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

symon

2021/07/14 14:17

ありがとうございます。 無事動きました! これでmain()を使った場合はどうなるでしょうか?
rtgsdfsdg

2021/07/14 18:07

同じく頭にselfをつけメソッドであることを明示します。
symon

2021/07/17 09:33

ありがとうございます。 確かにできましたが、よく見かける以下のような形にはならないのでしょうか? class **(): def __init__: ~~ def main(): input() output() def input(): ~~ def output(): ~~ if __name__ == "__main__": main() class_instance = **() class_instance.main()
rtgsdfsdg

2021/07/17 10:10

インデントが分からないのでなんとも言えないのですが、main関数は一般的にクラスに含めません。そして、main関数内で**のインスタンスを作成し操作します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問