前提・実現したいこと
スクールの課題です。
以下のクラスを定義しています。
class Person(object): def __init__(self, name, age, gender): self._name = name self._age = age self._gender = gender self._friend = None def __eq__(self, person): return str(self) == str(person) def __str__(self): if self._gender == 'M': title = 'Mr' elif self._gender == 'F': title = 'Miss' else: title = 'Ms' return title + ' ' + self._name + ' ' + str(self._age) def __repr__(self): return 'Person: ' + str(self) def get_name(self): return self._name def get_age(self): return self._age def get_gender(self): return self._gender def set_friend(self, friend): self._friend = friend def get_friend(self): return self._friend
クラスの「外部で」、インスタンスの「名前」、「年齢」、友人がいる場合「友人」の属性をプリントする
関数を定義する必要があります。
発生している問題・エラーメッセージ
このように関数を書きました。
def print_friend_info(person): n = person.get_name() a = person.get_age() fr = person.get_friend() print(n) print(a) if fr: fr_is = fr._name print(f'Friends with {fr_is}')
しかし、「友人」を書き出すパートのみなぜか上手く認識されません。
if fr: 以降が該当箇所なのですが、何か穴等ありますでしょうか?(カバーできていないパターン等)
該当のソースコード
python
試したこと
こちらのコードも試しました。同じく、「友人」を書き出すパートのみ認識されません。
def print_friend_info(person): print(person._name) print(person._age) fr = person.get_friend() if fr: print(f"Friends with {fr._name}")
微妙に違う文法で何通りか試してみましたが、どれも同じく「友人」を書き出すパートのみ駄目でした。
補足情報(FW/ツールのバージョンなど)
バージョン: python3.9
IDE: IDLE(Python3.9 64-bit)
関数はクラスとは独立しており、また上記のコード以外の呼び出しコードや枠組み等といったものは使用しておりません。
自分の書いたprint_friend_info関数でカバーできていないシチュエーションがあれば教えてください。
(インプットは正しいという前提で)
コードは"<code>"または"<コード>"のボタンを押して出てくるやつの中に書きましょう。
今のままでは読みづらいです。
それにPythonはインデントが意味を持ちます。
質問は編集できるので編集してください。それからです。
それと、コードはすべて提示してください。少なくともprint_friend_info関数とやらを呼び出している場所があるはずです。
ということはこのコードは中途半端な状態ってことです。それで回答はできません。
「「友人」を書き出すパートのみ認識されません。」とか、 「友人」を書き出すパートのみ駄目」とは具体的にどうだめですか。
また、上の方も書いているように、その問題が発生したときのコードも提示してください。
単に、友人を設定していないだけなんじゃないかと思ってますが。
>>>BeatStarさん
今投稿を確認してみたところ、何故かインデントが全解除されていたようですので
コードを一から書き直してみました。ご指摘ありがとうございます。
print_friend_info関数はクラスとは独立した関数であり、またクラスの定義とこちらの関数で
コードは全てになります。(そのため、関数が呼び出されていなかった等の問題は発生するとは思いません)
>>>TakaiYさん
「友人」をset_friend(friend)メソッドにて設定し、print_friend_info関数で書きだすと確かに友人にあたるインスタンスの名前が書きだされ、設定していないと何も表示されない、と自分では正常に作動しているように見えるのですが、それでも認識されません。
また、今コードを再度書き直して実行してみたところ、「名前」、「年齢」、「友人」情報の全てが認識されなくなっていました…。自分の書いた関数のコード内に、何か穴等はありますか?というのが質問です。
こういうパターンに対応できていない、こういう時にクラッシュするというパターンがあれば教えてください。
インプットの形は正しい(クラス型である)という前提は成り立つと思われます。
>またクラスの定義とこちらの関数でコードは全てになります。(そのため、関数が呼び出されていなかった等の問題は発生するとは思いません)
これで全てだったらprint_friend_infoを呼んでいる部分がないでしょう。
「「友人」をset_friend(friend)メソッドにて設定し、print_friend_info関数で書きだすと確かに友人にあたるインスタンスの名前が書きだされ、設定していないと何も表示されない、と自分では正常に作動しているように見える」
のであれば、全く正常に思えます。が、「それでも認識されません」ですか。
あなたの言う「認識され」るとはどういうことを想定していますか?
また、BeatStarさんへの回答に「こちらの関数でコードは全てになります。」とありますが、これでは定義のみしかないので、クラスはインスタンスが作られず、関数も呼ばれませんから、何も起きませんよ。
「実行」したときのコードも提示してください。
お返事遅くなってしまってすみません。
>>>ozwkさん
後ほど個別に、set_friendを用いてインスタンスにfriendを持たせ、print_friend_infoを呼び出すという作業を行っています。
>>>TakaiYさん
自分では、以下の様に実行しています。
a = Person("A", 10, "M")
b = Person("B", 15, "F")
a.set_friend(b)
print_friend_info(a) <出力: A 10 Friends with B>
print_friend_info(b) <出力: B 15>
このprint_friend_info関数自体なのですが、例えばこういう入力があったらコードがクラッシュするとか、こういうケースがカバーできていないとか欠陥がありますでしょうか?
よろしければご指摘ください。
> 例えばこういう入力があったらコードがクラッシュするとか、こういうケースがカバーできていないとか欠陥がありますでしょうか?
それは、このプログラムをどのように使うかによりますから、こちらからは何とも言えませんよ。
たとば、set_friendで設定するオブジェクトが_name属性を持っていなければ落ちますが、それを保証するのがどれなのかは設計によります。
また、途中で 「fr_is = fr._name」このように使っていますが、ここはget_nameを使うべきだろうとかも気になりますね。
何を心配しているのかよくわかりません。
あと、もう一度聞きますが、あなたの言う「認識され」るとはどういうことを想定していますか?
>後ほど個別に、
それをどう書いているかを提示してください
>>>TakaiYさん
>途中で 「fr_is = fr._name」このように使っていますが、ここはget_nameを使うべきだろうとかも気になります
こちら修正してコードを実行してみたところ、正しく動きました。
>あなたの言う「認識され」るとはどういうことを想定していますか
プライベートアトリビュートに直接アクセスしたら上手く動かない、という事だったようなのです。 (一人でやっているコーディングではなかったのですが、何をしてほしいのか説明があまりに不足していて、何故認識されないか説明のしようがなかったのです) 解答ではないのでベストアンサーに選ぶことは残念ながらできませんが、メソッドを使う事で問題は解決しました。本当にありがとうございました。
>>>ozwkさん
お陰様で問題は解決いたしましたが、実行コードを以下に提示します。
a = Person("A", 10, "M")
b = Person("B", 15, "F")
a.set_friend(b)
print_friend_info(a) <出力: A 10 Friends with B>
print_friend_info(b) <出力: B 15>
回答2件
あなたの回答
tips
プレビュー