Code Fix

中級

インスタンスを介さずメソッドを呼んだ原因と直し方

クラスのメソッドをインスタンスを介さずに呼び出したときに出るエラーです。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() にします。

この問題を解いてみる →

パターン4

 1  class Timer:
 2      def start(self):
 3          print("Started")
 4  
 5  Timer      .start()
         ^
Traceback (most recent call last): File "main.py", line 5, in <module> Timer.start() TypeError: Timer.start() missing 1 required positional argument: 'self'

インスタンスを作らずクラスから直接メソッドを呼ぶと、selfに渡すものが無くエラーになります。

直し方: Timer を Timer() にします。

この問題を解いてみる →

パターン5

 1  class Light:
 2      def turn_on(self):
 3          print("On")
 4  
 5  Light      .turn_on()
         ^
Traceback (most recent call last): File "main.py", line 5, in <module> Light.turn_on() TypeError: Light.turn_on() missing 1 required positional argument: 'self'

括弧を付けてインスタンスを作ってからメソッドを呼び出す、という2段階を省略すると起きるミスです。

直し方: Light を Light() にします。

この問題を解いてみる →

よくある誤解

selfは自分で書かなければならないおまじないだと思われがちですが、実際にはPythonが呼び出し時に自動で渡す引数です。クラスから直接呼ぶとその自動供給が起きません。

実務での勘所

instance.method(引数)という呼び出しは、実際にはClassName.method(instance, 引数)という形に変換されてから実行されます。つまりselfに入る値は、ドットの前に書いたインスタンスがPythonによって自動的に先頭の引数として差し込まれた結果です。クラス名から直接ClassName.method(引数)のように呼ぶと、この自動的な差し込みが起きないため、本来2つ必要な引数(selfと本来の引数)が1つ足りないという扱いになります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)