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

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

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

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

Q&A

解決済

2回答

915閲覧

python classのエラー文

waddle_dee19

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/08/04 05:08

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
pythonでclassの機能を使って4つの変数を使って情報を扱うことができるプログラムを作っています。それに加えて5つ目の変数を作成し,4つの変数に入力されたものを5つ目に記憶させて好きなタイミングでプログラムを終了し,まとめて出力させるプログラムを作ろうとしていました。
上記の機能を実装中に以下のエラーメッセージが発生しました。

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

Traceback (most recent call last):
File "C:\Users\無題-72.py", line 6, in <module>
while x.name != "end":
AttributeError: name

該当のソースコード

python

1class P(object): 2 __slots__=["name","phonenumber","zipcode","address","link"] 3x=P() 4top=x 5x.name=0 6while x.name != "end": 7 x.name=input('Name>') 8 x.phonenumber=input('Phonenumber>') 9 x.zipcode=input('Codenumber>') 10 x.address=input('MOJI>') 11 x.link=P() 12 x=x.link 13x.link=None 14while x.link!=None: 15 print(x.name,x.phonenumber,x.zipcode,x.address) 16 x=x.link 17x=top 18while x.link!=None: 19 print(x.name,x.phonenumber,x.zipcode,x.adress) 20 x=x.link 21 22 23 24

input

1Phonenumber>342 2Codenumber>124 3MOJI>g 4python 5

試したこと

出てきたエラー文を検索にかけたが類似するエラー例が見つからなかった為どのように対処すればいいのかわからず手が止まっています。

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

pythonの3.6のバージョンのものを使用しています。

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

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

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

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

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

guest

回答2

0

問題点について

同じエラーを出力する単純なソースコード

python

1class P(object): 2 __slots__ = ["name"] 3 4x = P() 5print(x.name)

を用いて説明します。x = P()でクラスPのインスタンスが作成されますが、この時点ではnameというアトリビュートは作成されていません。したがって元々のソースコードにあるwhile x.name != "end":でx.nameが文字列endかどうかを調べていますが、x.nameというアトリビュートが予め作成されている必要があります。

1回目はwhileの直前にx.name=0とありますので、ここでインスタンスxに対してnameというアトリビュートが作成されています。しかし2回目以降は

python

1x.link=P() 2x=x.link

となっていて、x.nameが作成されていません。そのためAttribute errorとなります。

解決方法について

x.nameが予め作成されていれば問題解決します。オリジナルのソースコードを以下のように2箇所変更すれば動作します。

python

1class P(object): 2 __slots__=["name","phonenumber","zipcode","address","link"] 3x=P() 4top=x 5x.name=input('Name>') # x.name=0ではなくここで入力してしまう 6while x.name != "end": 7 x.phonenumber=input('Phonenumber>') 8 x.zipcode=input('Codenumber>') 9 x.address=input('MOJI>') 10 x.link=P() 11 x=x.link 12 x.name=input('Name>') # 次のループのためにnameアトリビュートを作成 13x.link=None 14 15x=top 16while x.link!=None: 17 print(x.name,x.phonenumber,x.zipcode,x.adress) 18 x=x.link

投稿2020/08/04 06:04

yymmt

総合スコア1615

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

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

waddle_dee19

2020/08/04 06:13

なるほど,やはり二回目のための準備がちゃんとできていないのが問題だったのですね ありがとうございます!
guest

0

ベストアンサー

slots でクラス変数を宣言することができますが、宣言した変数をコンストラクタで
初期化してあげないとアクセス時にエラーになるようです。

質問のコードだと、入力1周目のときは、直前で x.name=0 としているので while x.name='end' を判定できますが、2周目以降は同様の処理がないので、 whileの判定時に初期化されていない name にアクセスしようとしてエラーになってしまいます。

修正したコードでは、クラスPにコンストラクタを追加して、そこで中身を初期化するようにしてみました。
あと、endの判定タイミングの問題で、最後に name = end な P が追加されてしまっていたのでそこも修正してあります。

python

1class P(object): 2 __slots__=["name","phonenumber","zipcode","address","link"] 3 4 def __init__(self): 5 # print("P instance created.") 6 self.name = "" 7 self.phonenumber = "" 8 self.zipcode = "" 9 self.address = "" 10 self.link = None 11 12x=P() 13top=x 14x.name=0 15while True: 16 x.name=input('Name>') 17 if (x.name == 'end'): 18 break 19 20 x.phonenumber=input('Phonenumber>') 21 x.zipcode=input('Codenumber>') 22 x.address=input('MOJI>') 23 x.link=P() 24 x=x.link 25 26x.link=None 27while x.link!=None: 28 print(x.name,x.phonenumber,x.zipcode,x.address) 29 x=x.link 30 31x=top 32while x.link!=None: 33 print(x.name,x.phonenumber,x.zipcode,x.address) 34 x=x.link

投稿2020/08/04 05:49

YakumoSaki

総合スコア2027

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

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

waddle_dee19

2020/08/04 05:58

なるほど!情報が処理されていない状態で無理押し込もうとしているのが良くなかったのですね! そのうえ他にも改善した方が良い点を教えて頂きありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問