0
0

構造体の検索 - <__main__.Member object at 0x14d495bb28e0>というのが出る

Last updated at Posted at 2024-01-26

class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    members.append(member)

q = int(input())
for member in members:
    if member.old == q:
        print(member.name)
        break


クラスにmemberデータを突っ込んでそれを配列に入れて
そこから調べようと思ったんですが。出力がでませんでした。

そこでprint()をいれて結果を確認しようとしたのですが

class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    #memberの中身を確認する
    print(member)
    members.append(member)

q = int(input())
for member in members:
    if member.old == q:
        print(member.name)
        break


するとよくわからない出力が。

<__main__.Member object at 0x14d495bb28e0>

なんだろうこれ。
よくわからないので、一旦コードをじっくり見ていると
原因がわかりました。
クラスのoldって数字っぽいですけど、文字列として登録してるんですね。
ですが、その後、いつもの習慣で、q = int(input())と、数字型で出してしまったので
文字列型と数字型ではFalseになるので空白という結果になったのでしょう。
そこで、下記のようにint()を抜きます。

class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    print(member)
    members.append(member)

#下記のint()を抜く
q = input()
for member in members:
    if member.old == q:
        print(member.name)
        break


今度は正しく出力されました。

で、タイトルの通り、<__main...>ってのは何者か。
Google検索もしましたがわかったようなわからないような結果に
なったので、GPTを使う練習も兼ねて今日始めてGPT3.5で聞いてみました。

すると答えが。

Q. クラスの構造体を変数に入れて、printすると、 下記の出力が出ました。これは何ですか?
<__main__.Member object at 0x14d495bb28e0>

***
ChatGPTの答え:

この出力は、Pythonにおいてオブジェクトのデフォルトの文字列表現です。<__main__.Member object at 0x14d495bb28e0> のような表記は、そのオブジェクトが __main__ モジュールに属する Member クラスのインスタンスであり、メモリ上のアドレスが 0x14d495bb28e0 であることを示しています。

このデフォルトの文字列表現は、__str__ メソッドを定義していない場合や、__str__ メソッドがオブジェクトの適切な文字列表現を提供していない場合に表示されます。

以前のコードでは __str__ メソッドを追加していますが、もしまだこの出力が表示されている場合は、__str__ メソッドが正しく実装されていない可能性があります。__str__ メソッドを以下のように修正してみてください:
class Member():
    def __init__(self, name, age, birth, state):
        self.name = name
        self.age = int(age)
        self.birth = birth
        self.state = state

    def __str__(self):
        return f"Name: {self.name}, Age: {self.age}, Birth: {self.birth}, State: {self.state}"

# main
N = int(input())
members = []
for _ in range(N):
    member = Member(*input().split())
    print(member)
    members.append(member)

q = int(input())
for member in members:
    if member.age == q:
        print(member.name)
        break
このように __str__ メソッドが正しく実装されていれば、
print(member) で上記のような出力ではなく、
オブジェクトの属性がわかりやすく表示されるはずです

実際に実装してみたところ、リアルに出力されました。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0