こんにちは。PyQサポートです。
今回は、「クラス内のメソッドでreturnが必要な理由」を解説します。
質問
クラスを使ってアドレス帳を作ろうとしています。姓、名のデータをつなげてフルネームを表示したり検索したりさせたいです。
そこでフルネームを作るメソッドを以下のように実装したのですが、クラスのメソッド内でprint()
を使うと、メソッドの外でフルネームを使いたい時に値がNoneになってしまいます。return
を使うと期待通り動くのですが、どうしてprint()
だけではいけないのか解りません。return
が必要な理由を教えてください。
書いたコード
class Person: def __init__(self, last_name, first_name, tel, mail_address): self.last_name = last_name # 姓 self.first_name = first_name # 名前 self.tel = tel # 電話番号 self.mail_address = mail_address # メアド def full_name(self): """フルネーム(姓+空白1文字+名前)を返す""" print(self.last_name + ' ' + self.first_name) # return self.last_name + ' ' + self.first_name person1 = Person('田中', '一郎', '03-1111-2222', 'ichiro@pyq.jp') print(person1.full_name() == '田中 一郎') person2 = Person('山田', '花子', '03-1111-3333', 'hanako@pyq.jp') print(person2.full_name() == '山田 花子')
実行結果
田中 一郎 False 山田 花子 False
正しいコード
class Person: def __init__(self, last_name, first_name, tel, mail_address): self.last_name = last_name # 姓 self.first_name = first_name # 名前 self.tel = tel # 電話番号 self.mail_address = mail_address # メアド def full_name(self): """フルネーム(姓+空白1文字+名前)を返す""" return self.last_name + ' ' + self.first_name person1 = Person('田中', '一郎', '03-1111-2222', 'ichiro@pyq.jp') print(person1.full_name() == '田中 一郎') person2 = Person('山田', '花子', '03-1111-3333', 'hanako@pyq.jp') print(person2.full_name() == '山田 花子')
実行結果
True True
回答
return
しないと full_name
メソッドは戻り値を何も返しません。
代わりに、「値がないこと」を表す None を返します。
print()
はあくまで画面上に表示するだけです。
メソッドの外で "田中 一郎"という文字列を扱いたい場合は、 return
を使ってself.last_name + ' ' + self.first_name
の処理結果を返す必要があります。
return
とprint()
でperson1.full_name()
からの戻り値を確認してみると良いかと思います。
それぞれ以下のような挙動になるはずです。
print()の場合
name = person1.full_name() # このタイミングで"田中 一郎"が画面上に表示される print(name) # メソッドfull_name()にreturnがないので、変数nameにはNoneが代入されます。変数nameをprintしてもNoneと表示される
return の場合
name = person1.full_name() # 特に何も表示されない。戻り値が変数nameに格納される print(name) # 変数nameをprint()すると"田中 一郎" と表示される。変数nameの中に文字列データがあることが確認できる