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)の扱い方」と「プライベートプロパティの書き方」でつまずきやすいポイントがあるということです。

コメント