Pythonの「クラス(class)」とは?JavaScriptとの違いを徹底解説

未分類

Pythonの「クラス(class)」は、データ(属性)とそれに対する処理(メソッド)をひとまとめにした「オブジェクトの設計図」です。この設計図をもとにして、実際にデータを持たせた「インスタンス(実体)」を生成します。

まずはPythonにおけるクラスの基本構造を見ていきましょう。


Pythonのクラスの概要と具体例

Pythonでクラスを定義する際は、classキーワードを使用します。初期化処理(コンストラクタ)には特殊なメソッド名である__init__を用い、クラス内のメソッドは最初の引数として必ず自分自身を指すselfを受け取るのが最大の特徴です。

Pythonの具体例:

class User:
    # コンストラクタ(初期化メソッド)
    def __init__(self, name, age):
        self.name = name  # インスタンス変数(属性)の定義
        self.age = age

    # メソッド
    def greet(self):
        # selfを使って自身のデータにアクセスする
        print(f"こんにちは、{self.name}です。{self.age}歳です。")

# 設計図(クラス)から実体(インスタンス)を作成
user1 = User("太郎", 25)
user1.greet()  # 出力: こんにちは、太郎です。25歳です。

このように、関連するデータと振る舞いを1つのカプセルにまとめることで、コードの再利用性や保守性を高めることができます。


PythonとJavaScriptのクラスの「同じ点」

JavaScript(ES6以降)にもclass構文が存在します。どちらもオブジェクト指向プログラミング(OOP)を簡単に実現するための機能として、以下のような共通点を持っています。

  • 設計図から実体を作る概念: どちらもnewキーワード(Pythonではクラス名そのものを関数のように呼ぶだけですが、概念は同じです)を使ってインスタンスを生成します。
  • 初期化とメソッドの定義: インスタンス生成時に呼ばれるコンストラクタと、固有の処理を行うメソッドを定義できます。
  • 継承(Inheritance): 既存のクラスをベースにして、新しいクラスを作ることができます(class Child(Parent):class Child extends Parent)。

JavaScriptで同じ機能を書いた例:

class User {
  // コンストラクタ
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  // メソッド
  greet() {
    console.log(`こんにちは、${this.name}です。${this.age}歳です。`);
  }
}

const user1 = new User("太郎", 25);
user1.greet(); // 出力: こんにちは、太郎です。25歳です。

PythonとJavaScriptのクラスの「異なる点」

見た目はよく似ていますが、裏側の仕組みや構文のルールには明確な違いがあります。

わかりやすく比較表にまとめました。

特徴PythonのクラスJavaScriptのクラス
裏側の仕組み純粋なクラスベースのオブジェクト指向プロトタイプベースのオブジェクト指向の「糖衣構文(見た目だけクラス風にしたもの)」
自身への参照self(メソッドの第1引数として明示的に受け取る)this(実行時のコンテキストによって暗黙的に決まる)
コンストラクタdef __init__(self, ...):constructor(...) { ... }
インスタンス化User("太郎")newは不要)new User("太郎")newが必須)
プライベート変数__name(名前修飾による疑似的な非公開)#name(言語仕様としての完全なプライベートフィールド)

違いが際立つ具体例:自身への参照(self vs this)

Pythonでは、メソッド内で自身のプロパティにアクセスする際、明示的に受け取ったselfを必ず使います。これにより「今どのオブジェクトのデータを扱っているか」がコード上で明確になります。

一方、JavaScriptのthisは、メソッドが「どこで・どのように呼び出されたか」によって中身が変わってしまうという厄介な特性を持っています。

// JavaScriptにおけるthisの落とし穴
class Greeter {
  constructor(name) {
    this.name = name;
  }
  sayHello() {
    console.log("Hello, " + this.name);
  }
}

const g = new Greeter("Bob");
g.sayHello(); // "Hello, Bob" (正常)

// 別の変数に関数を代入して実行すると...
const func = g.sayHello;
func(); // "Hello, undefined" またはエラーになる(thisを見失うため)

Pythonのselfは引数として束縛されているため、このような「thisを見失う」といった事態は起こりません。

PythonとJavaScriptのクラスは、用途や役割は同じでも、特に「自身(self / this)の扱い方」と「プライベートプロパティの書き方」でつまずきやすいポイントがあるということです。

コメント

タイトルとURLをコピーしました