TypeError: missing 1 required positional argument: 'self' の原因と直し方
クラスのメソッドをインスタンスを介さずに呼び出したときに出るエラーです。selfには本来インスタンス自身が自動で渡されます。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
5- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
Dog.bark() missing 1 required positional argument: 'self'- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 class Dog: 2 def bark(self): 3 print("Woof") 4 5 Dog .bark() ^
Traceback (most recent call last):
File "main.py", line 5, in <module>
Dog.bark()
TypeError: Dog.bark() missing 1 required positional argument: 'self'
selfにはインスタンス自身が自動で渡されます。クラスから直接呼び出すとインスタンスが無いため、selfの分が足りなくなります。
直し方: Dog を Dog() にします。
広告
広告スロット(未設定)
パターン2
1 class Counter: 2 def increment(self): 3 return 1 4 5 Counter .increment() ^
Traceback (most recent call last):
File "main.py", line 5, in <module>
Counter.increment()
TypeError: Counter.increment() missing 1 required positional argument: 'self'
インスタンスを作らずクラスから直接メソッドを呼ぶと、selfに渡すものが無くエラーになります。
直し方: Counter を Counter() にします。
パターン3
1 class Robot: 2 def move(self): 3 print("Moving") 4 5 Robot .move() ^
Traceback (most recent call last):
File "main.py", line 5, in <module>
Robot.move()
TypeError: Robot.move() missing 1 required positional argument: 'self'
括弧を付けてインスタンスを作ってからメソッドを呼び出す、という2段階を省略すると起きるミスです。
直し方: Robot を Robot() にします。
よくある誤解
selfは自分で書かなければならないおまじないだと思われがちですが、実際にはPythonが呼び出し時に自動で渡す引数です。クラスから直接呼ぶとその自動供給が起きません。
まとめ
TypeError: missing 1 required positional argument: 'self'は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。