‘str’ object has no attribute ‘xxx’

エラー詳細

Pythonのエラー

意味

str型のオブジェクトはxxxってメンバ(変数やメソッドやプロパティ)を持ってないよ。

(strを例に上げたが、他の型名でも意味は同じ。)

原因

その型に存在しないメンバを呼び出そうとしたときに発生する。

単にスペルミスか、呼び出し元の型を勘違いしてるときに起きることが多い気がするがだいたいすぐわかるし、最近は開発環境が優秀なので単純なケースでは実行前に気づくことも多い。

あと、クラスでメンバ変数初期化前にメンバ変数を呼び出してしまったときにもこれが起こる。

「え?このメンバ実装したよ?なんで?」と混乱しがちだが、単にメンバ定義前に使おうとしてるから存在してないだけ。

class MyClass:
    def __init__(self):
        self.a = 1

    def method(self):
        self.b = 3


if __name__ == "__main__":
    obj = MyClass()
    print(obj.a)
    # print(obj.b) # methodを呼び出す前にbを使おうとするとこのエラーが起きる
    obj.method() 
    print(obj.b) # こっちはOK

エラー対処法(事前に防ぐために)

型ヒントとインテリセンス(変数関数名の補完機能)を有効活用し、事前にミスを防ぐ。

今どきインテリセンス的な機能がない開発環境ってそんなにないはずなので、もし今使ってる環境になければ乗り換え推奨。有名所のPyCharmとかVSCode(Pylance)なら間違いないし、Jupiter Notebookとかgoogle colaboでも補完機能はあったはず。

あと、クラスのメンバ変数は__init__内で全て初期化すること。クラス作ってるうちについつい変なところでメンバ変数作りたくなってしまっても誘惑に負けない。