JavaScript の「this」と Python の「self」の比較

Dec 19 2022
オブジェクト指向プログラミングでは、 this と self の両方を使用して、メソッドが呼び出されているオブジェクトの現在のインスタンスを参照します。オブジェクトは、データ フィールドとメソッドを含むデータ構造です。
ディベラコーヒーによる写真

オブジェクト指向プログラミングでは、thisselfはどちらも、メソッドが呼び出されているオブジェクトの現在のインスタンスを参照するために使用されます。

オブジェクトは、データ フィールドとメソッドを含むデータ構造です。オブジェクトは、オブジェクトを作成するためのテンプレートまたは設計図である、クラスの特定のインスタンスを表します。

メソッドは、オブジェクトに関連付けられた関数であり、オブジェクトに対して何らかのアクションまたは計算を実行するために使用されます。メソッドはクラス定義で定義され、特定のタスクを実行するためにオブジェクトで呼び出すことができます。

JavaScript では、thisキーワードは現在の関数を実行している現在のオブジェクトを参照します。これは、オブジェクト自体からオブジェクトのプロパティとメソッドにアクセスする方法です。の値はthis、関数の呼び出し方法によって決まります。

thisJavaScript での の使用例を次に示します。

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

person.sayHi(); // Output: "Hi, my name is John"

Python では、selfパラメータはクラスのインスタンスを参照するために使用されます。this他のオブジェクト指向言語と同等です。selfパラメータは、クラス自体からクラスの属性とメソッドにアクセスするために使用されます。

selfPython での の使用例を次に示します。

class Person:
  def __init__(self, name):
    self.name = name
  
  def say_hi(self):
    print(f"Hi, my name is {self.name}")

person = Person("John")
person.say_hi() # Output: "Hi, my name is John"

Python でパラメーターを使用するときに発生する可能性のある一般的なバグの 1 つselfは、メソッド定義の最初のパラメーターとしてパラメーターを含めるのを忘れていることです。これによりTypeError、メソッドが呼び出されたときに a が発生する可能性があります。これは、メソッドがselfパラメーターが渡されることを期待しているためです。

このタイプのバグの例を次に示します。

class Person:
  def __init__(self, name):
    self.name = name
  
  def say_hi(): // missing self parameter
    print(f"Hi, my name is {self.name}") 

person = Person("John")
person.say_hi()

このバグを修正するには、次のselfようにメソッド定義にパラメーターを含める必要があります。

def say_hi(self):
    print(f"Hi, my name is {self.name}")

JavaScript のデバッグ

thisJavaScript でキーワードを使用するときに発生する可能性のある一般的なバグの 1 つthisは、オブジェクトにバインドされていない関数内で使用することです。この場合、 の値がthisグローバル オブジェクトに設定されるため、予期しない動作が発生する可能性があります。

このタイプのバグの例を次に示します。

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi;
greet(); // Output: "Hi, my name is undefined"

関数を呼び出すと、greet関数内の値はthis、プロパティを持たないグローバル オブジェクトに設定されnameます。その結果、undefined予期された値ではなく、挨拶がログに記録されます。

このバグを修正するには、変数の作成時に の値をオブジェクトにバインドするかthisperson独自の値を持たず、周囲のコンテキストの値を使用するメソッドにgreetアロー関数を使用します。sayHithisthis

メソッドを使用して例を修正するbind方法は次のとおりです。

const person = {
  name: 'John',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi.bind(person);
greet(); // Output: "Hi, my name is John"

const person = {
  name: 'John',
  sayHi: () => {
    console.log(`Hi, my name is ${this.name}`);
  }
}

const greet = person.sayHi;
greet(); // Output: "Hi, my name is John"

JavaScript では、thisキーワードを使用して、オブジェクト自体からオブジェクトのプロパティとメソッドにアクセスします。の値がthisどのように決定されるか、およびそれを正しく使用する方法を理解することは、JavaScript でオブジェクトを操作するために不可欠です。

Python では、selfパラメーターを使用してクラスのインスタンスを参照し、その属性とメソッドにアクセスします。パラメータを正しく使用する方法を理解することはself、Python でクラスやオブジェクト指向プログラミングを操作するために不可欠です。

thisJavaScript とPythonを正しく理解していなければ、selfオブジェクトとクラスを使用する正しく保守可能なコードを作成することは困難です。

2 つのプログラミング言語の類似点と相違点については、私の別の投稿「JavaScript と Python に関するいくつかのこと」を参照してください。

お読みいただきありがとうございます。お役に立てば幸いです。フィードバックをお待ちしております。エラーを見つけた場合は、親切にお知らせください。