Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonに1つの必須の位置引数がありません:「自己」ソリューション

Pythonクラスは、メソッドにアクセスする前に、インスタンス化または呼び出す必要があります。クラスのオブジェクトをインスタンス化するのを忘れて、クラスメソッドにアクセスしようとすると、「必要な位置引数が1つありません:「自己」」というエラーが発生します。

このガイドでは、このエラーの意味と、エラーが発生する理由について説明します。このエラーの実際の例を見ていき、修正方法を学ぶのに役立ててください。

必要な位置引数を1つ欠落している:「自己」

位置引数は、関数に渡されるデータを参照します。クラスでは、すべての関数に「self」という値を指定する必要があります。 「self」の値は、JavaScriptの「this」に似ています。 「自己」は、クラスのオブジェクトに格納されているデータを表します。

最初にそのクラスのオブジェクトをインスタンス化せずにクラスメソッドを呼び出すと、エラーが発生します。これは、オブジェクトがインスタンス化されるまで「自己」には価値がないためです。

「必要な位置引数が1つありません:「自己」」エラーの原因となる最も一般的な間違いは次のとおりです。

  • クラスのオブジェクトをインスタンス化するのを忘れている
  • 誤った構文を使用してクラスをインスタンス化する

これらの各原因を個別に見ていきましょう。

原因#1:オブジェクトのインスタンス化を忘れている

クラス内のメソッドにアクセスする前に、オブジェクトをインスタンス化する必要があります。

ビデオゲームのヒーローに関する情報を格納するクラスを定義します。

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

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()

変数「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.show_player() 情報を表示できるヒーローを作成していないため、機能しません。

このエラーを解決するには、show_player()を呼び出す前に、まずオブジェクトをインスタンス化します。 :

luke = Hero("Luke", "Mage")
luke.show_player()

コードをもう一度実行します:

Player Name: Luke
Player Type: Mage

コードは正常に実行されます。最初に、Lukeというプレーヤーに関する情報を格納する「luke」という変数を宣言しました。ルークのプレイヤータイプは「メイジ」です。そのオブジェクトをインスタンス化したので、show_player()を呼び出すことができます。 メソッド。

原因#2:クラスを誤ってインスタンス化する

クラスを誤ってインスタンス化すると、「1つの必須の位置引数がありません:「自己」」エラーが発生する可能性があります。次のコードを検討してください:

luke = Hero
luke.show_player()

このコードは前の例のソリューションに似ていますが、正しくありません。これは、Heroという単語の後に括弧を追加していないためです。これらの括弧がないため、プログラムはクラスをインスタンス化する必要があることを認識していません。

Heroの後に括弧を追加し、必要な引数「name」と「player_type」を指定することで、この問題を解決します。

luke = Hero("Luke", "Mage")
luke.show_player()

これで、コードが正常に実行され、プレーヤーに関する情報が返されます:

Player Name: Luke
Player Type: Mage

結論

クラスメソッドを呼び出す前にクラスのオブジェクトをインスタンス化しない場合、「欠落している1つの必須の位置引数:「自己」」エラーが発生します。このエラーは、クラスを誤ってインスタンス化した場合にも発生します。

このエラーを解決するには、クラスのメソッドにアクセスする前に、まずクラスのオブジェクトをインスタンス化するようにしてください。次に、オブジェクトをインスタンス化するために正しい構文を使用していることを確認してください。

これで、Pythonのエキスパート開発者のように、この一般的なエラーを解決する準備が整いました。


  1. Pythonでの継承

    この記事では、Python3.xでの継承と拡張クラスについて学習します。またはそれ以前。 継承は実際の関係をうまく表し、再利用性を提供し、推移性をサポートします。開発時間が短縮され、メンテナンスが容易になり、拡張も容易になります。 継承は大きく5つのタイプに分類されます- シングル 複数 階層的 マルチレベル ハイブリッド 上の図に示されているように、継承とは、実際に親クラスのオブジェクトを作成せずに、他のクラスの機能にアクセスしようとするプロセスです。 ここでは、単一の階層型継承の実装について学習します。 単一継承 例 # parent class class Studen

  2. Pythonのクラスメソッドと静的メソッド

    Pythonのクラスメソッドはメソッドであり、クラスにバインドされていますが、そのクラスのオブジェクトにはバインドされていません。静的メソッドも同じですが、いくつかの基本的な違いがあります。クラスメソッドの場合は@classmethodデコレータを指定する必要があり、静的メソッドの場合は@staticmethodデコレータが使用されます。 クラスメソッドの構文。 class my_class: @classmethod deffunction_name(cls, arguments): #Function Body return value 静的メソッ