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

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

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

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

Q&A

解決済

2回答

325閲覧

ユーザー定義クラスについて

shin000

総合スコア2

Python

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

0グッド

0クリップ

投稿2022/05/16 06:40

編集2022/05/16 08:34

python3

1コード 2```class Person: 3 def __init__(self,name,age): 4 self.name=name 5 self.age=age 6 def print_younger_person_name(p1,p2): 7 if p1>p2: 8 print('小林花子') 9 elif p1==p2: 10 print('高橋太郎') 11 12a=Person("高橋太郎",19) 13b=Person("小林花子",18) 14a.print_younger_person_name() 15Traceback (most recent call last): 16 File "<pyshell#44>", line 1, in <module> 17 a.print_younger_person_name() 18TypeError: Person.print_younger_person_name() missing 1 required positional argument: 'p2' 19 20 21引数で受け取る2つのpersonオブジェクトのうち、年齢の若い方を出力する。ただし、同じ年齢の場合はp1の名前を出力するという処理なのですが上手くいきません。 22どこが間違っているのでしょうか。

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

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

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

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

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

tatsu99

2022/05/16 08:16 編集

インデントがでたらめなので、ソースの意図が判りません。 ソースのアップ方法 以下のようにすると、きちんとソースが表示されます。 </>をクリックします。 ```ここに言語を入力 コード ``` と表示されるので ```① ② ``` ①の箇所にPython3と入力し ②の箇所にソースをコピペして貼り付けます。 そうすると、きちんと表示されます。 質問は編集可能です。ソースをきちんと表示してください。
shin000

2022/05/16 08:36

これでできていますでしょうか
tatsu99

2022/05/16 09:29

修整、ありがとうございました。 回答欄に記入しました。
guest

回答2

0

tatsu99さんから正しい回答がついていますから、そちらをBAにしていただければいいですが、悩んだあとが見えるので、ちょっと解説を。

python

1class Person: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def print_younger_person_name(p1,p2): 6 if p1>p2: 7 print('小林花子') 8 elif p1==p2: 9 print('高橋太郎') 10 11a=Person("高橋太郎",19) 12b=Person("小林花子",18) 13a.print_younger_person_name()

でているエラーですが、「メソッド(関数)に必要な引数が1つ(p2)足りません」とあります。
定義では「def print_younger_person_name(p1,p2)」このように引数を 2つ必要としていますが、実際の呼び出しは「a.print_younger_person_name()」このように 引数がありません。ただpythonでメソッドを呼ぶ場合は、暗黙で第一引数にインスタンスそのもの(この場合はa)が渡されるので、1つ足りないということになるのです。
ちなみに、メソッド定義で 第一引数に使われるselfは、言語仕様的には実は名前は何でもよくて、決まりとしてselfを使いましょうということになっています。なので、p1でもエラーにはなりません。

なので、単に回答をするのであれば、

python

1a.print_younger_person_name(b)

とするということになります。 これで、p2にbが対応するようになります。

次に、比較の「p1>p2」ですが、このようにクラスのインスタンスを直接比較できるようにするには、特殊メソッド(__gt____lt__など)の定義ぎ必要です。 簡単にやるのであれば、クラスの属性を使ったtatsu99さんの回答のようにすればいいでしょう。

さらに、メソッド定義ですが、先にも書いたように第一引数はselfとするのが通例です。

ということで、別解としてはこんな感じでしょうか。
aのメソッドを使っているので、aをさらに渡す必要はないかなと思います。

python

1class Person: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def print_younger_person_name(self,p2): 6 if self.age < p2.age: 7 print(self.name) 8 elif self.age > p2.age: 9 print(p2.name) 10 else: 11 print("same age") 12 13a=Person("高橋太郎",19) 14b=Person("小林花子",18) 15a.print_younger_person_name(b)

投稿2022/05/16 11:03

TakaiY

総合スコア12747

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

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

shin000

2022/05/16 13:37

メソッド定義をよく理解していませんでした。 細かい説明ありがとうございます。
guest

0

ベストアンサー

以下のようにしてください。

Python3

1class Person: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def print_younger_person_name(self,p1,p2): 6 if p1.age > p2.age: 7 print(p2.name) 8 else: 9 print(p1.name) 10 11a=Person("高橋太郎",19) 12b=Person("小林花子",18) 13a.print_younger_person_name(a,b) 14

実行結果
小林花子

投稿2022/05/16 08:52

tatsu99

総合スコア5438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問