Pythonの「missing 1 required positional argument: 'self'」エラーの原因と解決策
Pythonでは、クラスのメソッドにアクセスする前に、そのクラスをインスタンス化(オブジェクトとして生成)する必要があります。クラスのオブジェクトを生成せずにメソッドへアクセスしようとすると、「missing 1 required positional argument: 'self'(必須の位置引数'self'が1つありません)」というエラーが発生します。
この記事では、このエラーの意味と発生理由を解説し、実際のコード例を通して修正方法をわかりやすく紹介します。
「missing 1 required positional argument: 'self'」とは何か
位置引数(ポジショナル引数)とは、関数に渡されるデータのことです。Pythonのクラス内で定義されるすべての関数(メソッド)には、第一引数として「self」を指定する必要があります。「self」はJavaScriptにおける「this」に似た概念で、そのクラスから生成されたオブジェクトが持つデータを表します。
オブジェクトをインスタンス化せずにクラスメソッドを呼び出すと、このエラーが発生します。これは、「self」にはインスタンス化されたオブジェクトが存在しない限り値が代入されないためです。
このエラーが起こる主な原因は次の2つです。
- クラスのオブジェクトをインスタンス化し忘れている
- クラスをインスタンス化する際の構文が間違っている
原因1:オブジェクトのインスタンス化を忘れている
クラスのメソッドにアクセスするには、事前にオブジェクトをインスタンス化しておく必要があります。
ここで、ゲーム内のヒーロー情報を管理するクラスを定義してみましょう。
class Hero:
def __init__(self, name, player_type):
self.name = name
self.player_type = player_type
次に、プレイヤーの名前とタイプを出力するメソッドを追加します。クラス内で定義された関数は「メソッド」と呼ばれます。
def show_player(self):
print("Player Name: " + self.name)
print("Player Type: " + self.player_type)
続いて、プレイヤーを作成するためにこのクラスにアクセスしてみます。
luke = Hero.show_player()
この状態でコードを実行すると、次のようなエラーが出力されます。
Traceback (most recent call last):
File "main.py", line 10, in <module>
luke = Hero.show_player()
TypeError: show_player() missing 1 required positional argument: 'self'
コードが失敗したのは、Heroクラスのオブジェクトをインスタンス化していないためです。表示すべきヒーローの情報がまだ存在しないため、Hero.show_player()を直接呼び出しても正しく動作しません。
このエラーを解決するには、show_player()を呼び出す前に、まずオブジェクトをインスタンス化します。
luke = Hero("Luke", "Mage")
luke.show_player()
再度コードを実行してみましょう。
Player Name: Luke
Player Type: Mage
今度は正常に実行されました。変数「luke」には、プレイヤー名「Luke」、プレイヤータイプ「Mage」という情報を持つオブジェクトが格納されています。オブジェクトをインスタンス化した後であれば、show_player()メソッドを問題なく呼び出せるのです。
原因2:クラスのインスタンス化方法が間違っている
クラスのインスタンス化の仕方を誤った場合にも、このエラーが発生することがあります。次のコードを見てください。
luke = Hero
luke.show_player()
先ほどの解決策と似ていますが、このコードは間違っています。「Hero」の後に括弧「()」がないためです。括弧を付けないと、プログラムはクラスをインスタンス化しようとしていることを認識できません。
Heroの後に括弧を追加し、必要な引数である「name」と「player_type」を指定することで解決できます。
luke = Hero("Luke", "Mage")
luke.show_player()
コードは正常に実行され、プレイヤー情報が出力されます。
Player Name: Luke
Player Type: Mage
まとめ
「missing 1 required positional argument: 'self'」エラーは、クラスメソッドを呼び出す前にオブジェクトをインスタンス化していない場合や、クラスのインスタンス化の構文が誤っている場合に発生します。
このエラーを防ぐには、クラスのメソッドにアクセスする前に必ずオブジェクトをインスタンス化し、その際にクラス名の後に括弧を付けるという正しい構文を使うようにしましょう。
これで、あなたも経験豊富なPython開発者のように、このよくあるエラーを自信を持って解決できるはずです!
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(
-
Pythonのクラスメソッドと静的メソッドの違いを徹底解説
Pythonにおけるクラスメソッド(classmethod)は、クラスのインスタンスではなく、クラスそのものに紐づけられるメソッドです。静的メソッド(staticmethod)もこれと似ていますが、両者にはいくつかの重要な違いがあります。クラスメソッドには@classmethodデコレータを、静的メソッドには@staticmethodデコレータをそれぞれ付与して定義します。 クラスメソッドの構文 class my_class: @classmethod def function_name(cls, arguments): # 関数の処理内容