PythonのAttributeErrorとは?意味・原因・直し方を初心者向けに解説

Pythonでプログラムを書いていると、AttributeError というエラーが表示されることがあります。
たとえば、次のように文字列に対して append() を使おうとすると、AttributeErrorが発生します。
text = "Python"
text.append("!")このコードを実行すると、次のようなエラーが表示されます。
AttributeError: 'str' object has no attribute 'append'
これは、「文字列には append というメソッドがありません」という意味です。
AttributeErrorは、Python初心者がメソッドやオブジェクトを使うときによく出会うエラーです。特に、has no attribute という英語のメッセージが分かりにくく、どこを直せばよいのか迷ってしまうことがあります。
ただし、AttributeErrorはエラーメッセージの読み方を覚えると、原因を見つけやすいエラーです。
この記事では、PythonのAttributeErrorの意味、よくある原因、エラー例、修正方法を初心者向けに解説します。


AttributeErrorとは
AttributeErrorとは、Pythonで存在しない属性やメソッドを使おうとしたときに発生するエラーです。
ここでいう属性やメソッドは、オブジェクトが持っている情報や、そのオブジェクトに対して使える処理のことです。少し難しく聞こえるかもしれませんが、まずは「そのデータでは使えないものを呼び出したときに出るエラー」と考えると分かりやすいです。
たとえば、文字列には upper() というメソッドがあります。これは、文字列を大文字にするためのメソッドです。
text = "python" print(text.upper())
実行結果は次のようになります。
PYTHON
このように、文字列で使えるメソッドを呼び出している場合は問題ありません。
しかし、文字列に対して append() を使うとエラーになります。
text = "Python"
text.append("!")このコードでは、text は文字列です。append() はリストに要素を追加するためのメソッドなので、文字列では使えません。
そのため、次のようなAttributeErrorが発生します。
AttributeError: 'str' object has no attribute 'append'
このエラーメッセージは、次のように分けて読むと分かりやすくなります。
| 表示 | 意味 |
|---|---|
'str' object | 対象のデータは文字列 |
has no attribute | その属性やメソッドを持っていない |
'append' | 見つからなかった属性やメソッド名 |
つまり、AttributeError: 'str' object has no attribute 'append' は、「文字列には append という属性やメソッドがありません」という意味です。
AttributeErrorでよく使う用語も、ここで整理しておきましょう。
| 用語 | 意味 |
|---|---|
| オブジェクト | Pythonで扱う値やデータ |
| 属性 | オブジェクトが持っている情報 |
| メソッド | オブジェクトに対して使える処理 |
| AttributeError | 存在しない属性やメソッドを使ったときのエラー |
Pythonでは、文字列、数値、リスト、辞書など、それぞれのデータ型によって使えるメソッドが違います。
たとえば、append() はリストでは使えますが、文字列では使えません。
words = ["Python"]
words.append("!")
print(words)実行結果は次のようになります。
['Python', '!']
このように、同じ append() でも、使う相手がリストであれば問題ありません。
AttributeErrorが出たときは、まず「どの型のデータに対して」「どのメソッドや属性を使おうとしているのか」を確認しましょう。
エラーメッセージの中にある 'str' object や 'list' object の部分を見ると、対象になっているデータ型を確認できます。
AttributeErrorが起きる主な原因
AttributeErrorは、存在しない属性やメソッドを使おうとしたときに発生します。
ただし、実際には「メソッド名を間違えている」だけではなく、「変数の型が思っていたものと違う」「変数の中身が None になっている」など、いくつかの原因があります。
まずは、AttributeErrorが起きやすい原因を整理して見てみましょう。
| 原因 | 内容 | 確認すること |
|---|---|---|
| その型では使えないメソッドを呼んでいる | 文字列に append() を使うなど | 変数の型 |
| メソッド名のスペルミス | upper() を uper() と書いている | メソッド名のつづり |
| 大文字と小文字の違い | upper() を Upper() と書いている | 正しいメソッド名 |
変数が None になっている | 値が入っていると思った変数が None になっている | 変数の中身 |
| リスト・文字列・辞書を混同している | 別の型で使うメソッドを呼び出している | データ型ごとの使い方 |
| クラスの属性を定義していない | self.age を作る前に user.age を使っている | クラス内の属性定義 |
初心者のうちは、特に「その型では使えないメソッドを呼んでいる」「メソッド名のスペルミス」「変数が None になっている」という原因でつまずきやすいです。
たとえば、次のコードでは文字列に対して append() を使っています。
text = "Python"
text.append("!")このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'str' object has no attribute 'append'
append() はリストに要素を追加するためのメソッドです。text は文字列なので、append() は使えません。
このように、AttributeErrorでは「そのメソッドが使える型かどうか」を確認することが大切です。
また、メソッド名のスペルミスでもAttributeErrorになります。
text = "python" print(text.uper())
このコードでは、upper() と書くべきところを uper() と書いています。
実行すると、次のようなエラーが発生します。
AttributeError: 'str' object has no attribute 'uper'
Pythonは、uper というメソッドを探しますが、文字列にはそのようなメソッドがありません。そのため、AttributeErrorになります。
大文字と小文字の違いにも注意が必要です。
text = "python" print(text.Upper())
正しいメソッド名は upper() です。Upper() とは別の名前として扱われるため、次のようなエラーになります。
AttributeError: 'str' object has no attribute 'Upper'
Pythonでは、メソッド名や属性名も大文字と小文字を区別します。upper()、append()、keys() などのメソッド名は、正しいつづりで書く必要があります。
さらに、変数が None になっている場合にもAttributeErrorが発生します。
user_name = None print(user_name.upper())
このコードでは、user_name の中身は文字列ではなく None です。None には upper() というメソッドがないため、次のようなエラーになります。
AttributeError: 'NoneType' object has no attribute 'upper'
NoneType と表示された場合は、「変数に値が入っていない」「関数の戻り値が None になっている」可能性があります。
AttributeErrorが出たときは、まずエラーメッセージを見て、対象の型と見つからなかったメソッド名を確認しましょう。
たとえば、次のエラーでは、対象の型は str、見つからなかったメソッド名は append です。
AttributeError: 'str' object has no attribute 'append'
型や中身を確認したいときは、type() や print() を使うと分かりやすくなります。
text = "Python" print(text) print(type(text))
実行結果は次のようになります。
Python <class 'str'>
このように、AttributeErrorが出たときは「変数の中身」「変数の型」「使おうとしているメソッド名」を順番に確認すると、原因を見つけやすくなります。
AttributeErrorのエラー例と修正例
ここからは、実際にAttributeErrorが発生するコードと、その修正例を見ていきます。
AttributeErrorは、「どの型のデータに対して」「どの属性やメソッドを使おうとしたのか」を確認すると、原因を見つけやすくなります。
エラーメッセージに表示されている型とメソッド名に注目しながら、順番に確認していきましょう。
文字列にappend()を使っている例
まずは、文字列に対して append() を使ってしまう例です。
text = "Python"
text.append("!")このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'str' object has no attribute 'append'
text には "Python" という文字列が入っています。
しかし、append() はリストに要素を追加するためのメソッドです。文字列には append() というメソッドがないため、AttributeErrorが発生します。
文字列の後ろに文字を追加したい場合は、+ を使って文字列を連結します。
text = "Python" text = text + "!" print(text)
実行結果は次のようになります。
Python!
一方で、リストに要素を追加したい場合は、最初からリストを使います。
words = ["Python"]
words.append("!")
print(words)実行結果は次のようになります。
['Python', '!']
このように、同じ「追加したい」という場面でも、文字列に追加するのか、リストに要素を追加するのかによって書き方が変わります。
リストに文字列用のメソッドを使っている例
次に、リストに対して文字列用のメソッドを使ってしまう例です。
names = ["tanaka", "sato"] print(names.upper())
このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'list' object has no attribute 'upper'
upper() は、文字列を大文字にするためのメソッドです。
しかし、names は文字列ではなくリストです。リスト全体に対して upper() を使うことはできないため、AttributeErrorになります。
リストの中にある文字列を大文字にしたい場合は、リストから文字列を1つずつ取り出してから upper() を使います。
names = ["tanaka", "sato"]
for name in names:
print(name.upper())実行結果は次のようになります。
TANAKA SATO
この例では、for 文でリストの中身を1つずつ取り出しています。取り出された name は文字列なので、upper() を使うことができます。
メソッド名のスペルミスでAttributeErrorになる例
AttributeErrorは、メソッド名のスペルミスでも発生します。
次のコードでは、文字列を大文字にするために upper() を使いたい場面ですが、メソッド名を間違えています。
text = "python" print(text.uper())
このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'str' object has no attribute 'uper'
正しいメソッド名は upper() です。
しかし、コードでは uper() と書いています。Pythonは uper というメソッドを探しますが、文字列にはそのようなメソッドがないため、AttributeErrorになります。
この場合は、メソッド名を正しく書き直します。
text = "python" print(text.upper())
実行結果は次のようになります。
PYTHON
メソッド名のスペルミスは、見た目では気づきにくいことがあります。AttributeErrorが出たときは、エラーメッセージに表示されているメソッド名と、正しいメソッド名を見比べて確認しましょう。
大文字と小文字の違いでAttributeErrorになる例
Pythonでは、メソッド名の大文字と小文字も区別されます。
たとえば、次のコードでは upper() と書くべきところを Upper() と書いています。
text = "python" print(text.Upper())
このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'str' object has no attribute 'Upper'
Pythonでは、upper() と Upper() は別の名前として扱われます。
文字列には upper() というメソッドはありますが、Upper() というメソッドはありません。そのため、AttributeErrorが発生します。
この場合は、正しいメソッド名である upper() に修正します。
text = "python" print(text.upper())
実行結果は次のようになります。
PYTHON
AttributeErrorが出たときは、スペルだけでなく、大文字と小文字が正しいかも確認しましょう。
NoneType object has no attribute と表示される例
AttributeErrorで初心者がつまずきやすいのが、NoneType object has no attribute と表示されるパターンです。
次のコードを見てみましょう。
def get_name():
name = "tanaka"
user_name = get_name()
print(user_name.upper())このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'NoneType' object has no attribute 'upper'
このエラーは、None に対して upper() を使おうとしたという意味です。
get_name() の中では name = "tanaka" と書いていますが、return で値を返していません。そのため、user_name には "tanaka" ではなく None が入ります。
実際に確認すると、次のようになります。
def get_name():
name = "tanaka"
user_name = get_name()
print(user_name)
print(type(user_name))実行結果は次のようになります。
None <class 'NoneType'>
この場合は、関数の中で値を return する必要があります。
def get_name():
name = "tanaka"
return name
user_name = get_name()
print(user_name.upper())実行結果は次のようになります。
TANAKA
NoneType のAttributeErrorが出たときは、変数に本当に値が入っているかを確認しましょう。特に、関数の戻り値を変数に入れている場合は、return を書き忘れていないか確認することが大切です。
クラスの属性を定義していない例
クラスを使っている場合も、定義していない属性を参照するとAttributeErrorになります。
次のコードを見てみましょう。
class User:
def __init__(self):
self.name = "田中"
user = User()
print(user.age)このコードを実行すると、次のようなエラーが発生します。
AttributeError: 'User' object has no attribute 'age'
User クラスでは、self.name は定義していますが、self.age は定義していません。
そのため、user.age を使おうとしても、Pythonは age という属性を見つけることができず、AttributeErrorを出します。
この場合は、クラスの中で age を定義します。
class User:
def __init__(self):
self.name = "田中"
self.age = 20
user = User()
print(user.age)実行結果は次のようになります。
20
クラスを使っているときにAttributeErrorが出た場合は、__init__() の中でその属性を定義しているかを確認しましょう。
AttributeErrorは、単に「メソッド名を間違えた」というだけでなく、変数の型、変数の中身、クラスの属性定義などが原因になることがあります。エラーメッセージに表示された型と属性名を見て、どこが想定と違っているのかを確認することが大切です。
AttributeErrorに関するよくある質問
ここでは、PythonのAttributeErrorで初心者がつまずきやすい疑問をまとめて解説します。
AttributeErrorは、エラーメッセージの中に原因を探すヒントが多く含まれています。特に、has no attribute の前後に表示される型とメソッド名を見ることが大切です。
AttributeError: ‘str’ object has no attribute ‘append’ とはどういう意味ですか?
AttributeError: 'str' object has no attribute 'append' は、文字列には append() というメソッドがないという意味です。
たとえば、次のコードでは文字列に対して append() を使っています。
text = "Python"
text.append("!")このコードを実行すると、次のようなエラーになります。
AttributeError: 'str' object has no attribute 'append'
append() は、リストに要素を追加するためのメソッドです。文字列の後ろに文字を追加したい場合は、+ を使って連結します。
text = "Python" text = text + "!" print(text)
実行結果は次のようになります。
Python!
リストに要素を追加したい場合は、次のようにリストを使います。
words = ["Python"]
words.append("!")
print(words)実行結果は次のようになります。
['Python', '!']
同じ「追加する」という処理でも、文字列とリストでは書き方が違う点に注意しましょう。
AttributeError: ‘NoneType’ object has no attribute とは何ですか?
AttributeError: 'NoneType' object has no attribute ... は、変数の中身が None になっている状態で、属性やメソッドを使おうとしているという意味です。
たとえば、次のコードを見てみましょう。
user_name = None print(user_name.upper())
このコードでは、user_name の中身は文字列ではなく None です。そのため、upper() を使おうとするとエラーになります。
AttributeError: 'NoneType' object has no attribute 'upper'
このエラーが出た場合は、変数に本当に値が入っているかを確認しましょう。
user_name = None print(user_name) print(type(user_name))
実行結果は次のようになります。
None <class 'NoneType'>
関数の戻り値を変数に入れている場合は、return を書き忘れていないかも確認が必要です。
def get_name():
name = "tanaka"
user_name = get_name()
print(user_name)実行結果は次のようになります。
None
この場合は、次のように return を書きます。
def get_name():
name = "tanaka"
return name
user_name = get_name()
print(user_name.upper())実行結果は次のようになります。
TANAKA
NoneType のAttributeErrorが出たときは、変数の代入や関数の戻り値を確認しましょう。
メソッドがあるはずなのにAttributeErrorが出るのはなぜですか?
メソッドがあるはずなのにAttributeErrorが出る場合は、変数の型が想定と違っている可能性があります。
たとえば、文字列だと思っていた変数がリストだったり、リストだと思っていた変数が文字列だったりすると、使えるメソッドが変わります。
names = ["tanaka", "sato"] print(names.upper())
このコードでは、names はリストです。しかし、upper() は文字列に使うメソッドなので、リストには使えません。
AttributeError: 'list' object has no attribute 'upper'
このような場合は、type() を使って変数の型を確認します。
names = ["tanaka", "sato"] print(type(names))
実行結果は次のようになります。
<class 'list'>
リストの中の文字列に対して upper() を使いたい場合は、1つずつ取り出してから使います。
names = ["tanaka", "sato"]
for name in names:
print(name.upper())実行結果は次のようになります。
TANAKA SATO
AttributeErrorが出たときは、「そのメソッドが本当にその型で使えるか」を確認しましょう。
AttributeErrorを防ぐにはどうすればよいですか?
AttributeErrorを防ぐには、変数の型と中身を確認しながらコードを書くことが大切です。
特に、エラーが出たときは type() と print() を使って確認すると、原因を見つけやすくなります。
text = "Python" print(text) print(type(text))
実行結果は次のようになります。
Python <class 'str'>
また、メソッド名のスペルミスや大文字・小文字の違いにも注意しましょう。
text = "python" print(text.Upper())
このコードでは、正しいメソッド名は upper() ですが、Upper() と書いています。そのため、AttributeErrorになります。
text = "python" print(text.upper())
実行結果は次のようになります。
PYTHON
AttributeErrorを防ぐ基本は、次の3つです。
| 確認すること | 使う方法 |
|---|---|
| 変数の型 | type() |
| 変数の中身 | print() |
| メソッド名 | スペルと大文字・小文字を確認する |
まずは、変数が想定どおりの型になっているかを確認しましょう。そのうえで、その型で使えるメソッドかどうかを見直すと、AttributeErrorを防ぎやすくなります。
まとめ|AttributeErrorは型とメソッド名を順番に確認しよう
AttributeErrorは、Pythonで存在しない属性やメソッドを使おうとしたときに発生するエラーです。
たとえば、文字列に append() を使ったり、リストに upper() を使ったり、None に対してメソッドを呼び出したりすると、AttributeErrorが発生します。
エラーが出たときは、あわてずに「どの型に対して」「どのメソッドや属性を使おうとしたのか」を順番に確認しましょう。
型とメソッド名を見直せば、AttributeErrorの原因は見つけやすくなります。

