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

Python NameError:名前「self」が定義されていません解決策

値「self」は、関数が呼び出されて指定された場合にのみメソッド内で使用できます。

メソッドに指定された引数で、または引数として「self」を指定せずに関数内で「self」にアクセスすることはできません。それ以外の場合は、「NameError:name‘self’isnotdefined」というエラーが表示されます。

このガイドでは、このエラーの意味と、エラーが発生する理由について説明します。コード内のこのエラーを解決する方法を理解するのに役立つ、いくつかのコードスニペットについて説明します。

NameError:名前「self」が定義されていません

「self」変数は、クラス内のオブジェクトに関する情報を保持します。オブジェクトに割り当てられたすべての値は、「self」変数で使用できます。

メソッドで使用する場合は、「self」を引数として渡す必要があります。 「self」変数は、メソッド内からのみアクセスできるため、メソッド内の他の引数で使用することはできません。

次の場合、「NameError:name‘self’isnotdefined」エラーが発生します。

  • 引数として「自己」を指定しないでください
  • 別の引数の引数として「自己」を使用する

これらの各シナリオを1つずつ見ていきましょう。

シナリオ#1:「自己」が引数としてリストされていない

メソッドでアクセスできるようにするには、「self」を引数としてリストする必要があります。 「自己」はグローバル変数ではありません。クラス内でローカルです。

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

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

クラスの映画に関する情報を保持するプログラムを作成します。まず、ムービーに関する値を保持するコンストラクターを使用してクラスを定義します。

class Movie:
	def __init__(self, name, year_released):
			self.name = name
			self.year_released = year_released

私たちのクラスは、映画の名前と公開された年の2つの値を保持できます。次に、「year_released」の値を変更できるメソッドを宣言します。

	def change_year(year_released):
		   self.year_released = year_released
		   print("{} was released in {}.".format(self.name, self.year_released))

コードをテストするために、クラスのオブジェクトを作成します。このオブジェクトは、1996年に公開された映画「ハッピーギルモア」を表しています。

happy_gilmore = Movie("Happy Gilmore")
happy_gilmore.change_year(1996)

change_year()を呼び出しました 映画がリリースされた年を1996年に設定できるように、オブジェクトのメソッド。コードを実行して、機能するかどうかを確認しましょう。

Traceback (most recent call last):
  File "main.py", line 11, in <module>
	happy_gilmore.change_year()
  File "main.py", line 7, in change_year
	self.year_released = year_released
NameError: name 'self' is not defined

コードはエラーを返します。

このエラーは、メソッドの引数として「self」を渡していないために発生します。 change_year()の最初の引数として「self」を追加することで、このエラーを修正します。 方法:

def change_year(self, year_released):
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))

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

Happy Gilmore was released in 1996.

コードは正常に実行されます!

シナリオ#2:別の引数の引数として「自己」を使用する

「自己」は、関数が呼び出されたときに評価されます。これは、関数呼び出しで指定された引数のリストに「self」を参照する引数を含めることができないことを意味します。

「year_released」メソッドを更新して、別のリリース年が指定されていない場合に、映画の年が変更されていないことを通知するメッセージがコンソールに出力されるようにします。

これを行うには、コードにデフォルトの引数を設定します。

def change_year(self, year_released=self.year_released):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		print("This movie has not been changed.")

	print(year_released)

「year_released」のデフォルト値は「self.year_released」になりました。これは、年を変更する値を指定しない場合、デフォルト値が設定されることを意味します。値を指定する場合、デフォルトの代わりに指定した値が使用されます。

指定した値が「self.year_released」の値と等しくない場合、「self.year_released」の値が変更されます。それ以外の場合は、ムービーが変更されていないことをユーザーに通知するメッセージがコンソールに出力されます。

ifの後 ステートメントが評価されると、「year_released」の値がコンソールに出力されます。

コードを実行してみましょう:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
	class Movie:
  File "main.py", line 6, in Movie
	def change_year(self, year_released=self.year_released):
NameError: name 'self' is not defined

私たちのコードはエラーを発生させます。これは、引数リストの別の引数で「自己」を使用しようとしたためです。

このエラーを修正するには、引数のリストではなく、関数内で「year_released」変数の値を「self.year_released」に設定します。

def change_year(self, year_released=None):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		year_released = self.year_released
		print("This movie has not been changed.")

	print(year_released)

このコードでは、関数呼び出しで「year_released」の値を指定しない場合、「year_released」を「self.year_released」と等しくなるように設定します。

コードをテストするために、新しいMovieオブジェクトを作成しましょう:

happy_gilmore = Movie("Happy Gilmore", 1995)
happy_gilmore.change_year(1996)

Happy Gilmoreがリリースされた年を1995年と誤って指定しました。change_year()を使用して変更する必要があります 方法。私たちのコードは次を返します:

Happy Gilmore was released in 1996.
1996

コードは正常に実行されました。コードをテストして、「year_released」の値がchange_year()で指定した値とすでに等しい場合に何が起こるかを確認しましょう。 方法:

happy_gilmore = Movie("Happy Gilmore", 1996)
happy_gilmore.change_year(1996)

コードは次のようになります:

This movie has not been changed.
1996

私たちのコードはelseを実行します コード内のステートメントを使用して、映画が変更されていないことを通知します。

結論

「NameError:name‘self’ is not defined」エラーは、位置引数として「self」を指定するのを忘れた場合、または引数のリストの別の引数で「self」を使用した場合に発生します。

このエラーを解決するには、「self」を使用する関数のすべてのメソッドの引数リストに「self」が含まれていることを確認します。それが機能しない場合は、引数のリスト内の引数がデフォルト値を「自己」に依存していないことを確認してください。

これで、プロの開発者のようにこのPythonエラーを解決する準備が整いました!


  1. Pythonでの継承

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

  2. PythonでNameError例外をキャッチする方法は?

    NameErrorsは、コードが現在のスコープに存在しない名前を参照している場合に発生します。たとえば、修飾されていない変数名。 指定されたコードは、例外をキャッチしてそのタイプを見つけるために次のように書き直されます。 例 import sys try: def foo(): print magnolia foo() except NameError as e: print e print sys.exc_type 出力 C:/Users/TutorialsPoint1/~.py global name 'magnolia' is not defined <type