Pythonでクラスを学び始めると、インスタンス生成時の記述やメソッド呼び出し時のselfの扱いなど、独特に見える書き方につまずくことがあります。特に「なぜx.show()のように呼び出せるのか」「なぜメソッドの引数にselfを書く必要があるのか」という点は、オブジェクト指向を理解するうえで重要なポイントです。
この記事では、Pythonのクラス、インスタンス、__init__メソッド、selfの役割、メソッド呼び出しの仕組みについて、具体例を交えながら分かりやすく解説します。
Pythonのクラスとは何か
Pythonのクラスとは、データと処理をまとめた設計図のようなものです。例えば食品を管理するプログラムを作る場合、「食品名」や「価格」という情報と、それらを表示する処理をひとつのまとまりとして定義できます。
クラス自体は設計図なので、それだけでは実際のデータを持っていません。クラスから作られた実体のことをインスタンスと呼びます。
例えば以下のような関係になります。
| 種類 | 意味 |
|---|---|
| Foodクラス | 食品を表す設計図 |
| x | milkという情報を持ったFoodインスタンス |
| y | eggという情報を持ったFoodインスタンス |
つまり、同じFoodクラスから複数の食品データを作ることができます。
__init__メソッドはインスタンス作成時に自動実行される
Pythonのクラス内にある__init__メソッドは、インスタンスが作成された瞬間に自動的に呼び出される特別なメソッドです。
例えば以下のコードの場合、Food(‘milk’,150)を実行した時点で__init__が動きます。
通常の関数であれば自分で呼び出す必要がありますが、__init__はPythonが自動的に実行するため、データの初期設定を書く場所として使われます。
正しい書き方の例は以下のようになります。
class Food:
def __init__(self, name, price):
self.name = name
self.price = price
ここでself.nameやself.priceに値を保存することで、そのインスタンス専用のデータになります。
selfとは何のために書くのか
selfは、そのメソッドを呼び出したインスタンス自身を表す特別な変数です。
例えばx = Food(‘milk’,150)の場合、xはFoodクラスから作られたインスタンスです。このときselfにはx自身が自動的に渡されます。
つまり内部的には以下のような動きになります。
x.show()
これはPython内部では次のような処理として扱われています。
Food.show(x)
そのため、showメソッドではself.nameと書くことで、「このインスタンスが持っているname」という意味になります。
もしselfを書かなかった場合、どのインスタンスのデータを使えばよいのかPythonが判断できなくなります。
x.show()とy.show()の呼び出し方の理由
x.show()やy.show()のような書き方ができる理由は、インスタンスからクラスのメソッドを呼び出す仕組みがあるためです。
例えば以下のコードを考えます。
x = Food('milk', 150)
y = Food('egg', 200)
x.show()
y.show()
x.show()を実行すると、x自身がselfとしてshowメソッドへ渡されます。そのため、showメソッド内のself.nameはmilk、self.priceは150になります。
同じようにy.show()では、selfがyになるため、表示される内容はeggと200になります。
つまり同じshowメソッドでも、呼び出したインスタンスによって表示するデータが変わります。
showメソッドでself.nameとself.priceを使う理由
showメソッドは、インスタンスが持っている情報を表示するための処理です。
def show(self):
print(self.name, self.price)
このself.nameは、そのインスタンスのname属性を意味します。xの場合はmilk、yの場合はeggになります。
例えば以下のようなイメージです。
| 呼び出し | self | self.name | self.price |
|---|---|---|---|
| x.show() | x | milk | 150 |
| y.show() | y | egg | 200 |
この仕組みにより、1つのクラスから作った複数のデータを同じ処理で扱うことができます。
Pythonクラスを理解するための具体例
例えばゲームのキャラクターを管理する場合でも、同じ考え方が使えます。
class Player:
def __init__(self, name, level):
self.name = name
self.level = level
def show(self):
print(self.name, self.level)
このクラスから「勇者」「魔法使い」など複数のプレイヤーを作成できます。
それぞれのインスタンスが自分専用のnameやlevelを持つため、同じshowメソッドを使っても違う情報を表示できます。
まとめ
Pythonのクラスでは、クラスが設計図、インスタンスが実際のデータを持つオブジェクトになります。
__init__はインスタンス作成時に自動で実行され、selfを使ってそのインスタンス自身にデータを保存します。
x.show()やy.show()と書けるのは、Pythonが自動的に呼び出したインスタンスをselfとして渡しているためです。
selfの意味を理解すると、クラス、メソッド、インスタンスの関係が分かりやすくなり、Pythonのオブジェクト指向プログラミングをより深く理解できるようになります。


コメント