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の意味、よくある原因、エラー例、修正方法を初心者向けに解説します。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

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の原因は見つけやすくなります。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました