【Python 文法】クラスの基礎を徹底解説!__init__とselfも怖くない!

Python

Pythonの学習を進めていると、必ず「クラス(class)」という壁にぶつかります。「なんだか難しそう…」「__init__とかselfとか、おまじないが多くて分からない」と感じていませんか?

この記事では、そんなPythonのクラスの概念と基本的な使い方を、初心者の方にも分かりやすく、豊富なコード例と共に徹底的に解説します。

はじめに:Pythonのクラスとは?

まず、クラスがどのようなものかを理解しましょう。

クラスは、オブジェクト指向プログラミングという考え方の中心的な概念です。簡単に言えば、データ(属性)と処理(メソッド)をひとまとめにするための仕組みです。

この記事であなたが学べること

この記事を読み終える頃には、あなたは以下のことができるようになります。

  • Pythonのクラスの基本的な概念が理解できる
  • classを使ったクラスの定義方法がわかる
  • __init__selfの役割が説明できる
  • 自分で簡単なクラスを作成し、利用できるようになる

クラスは「設計図」、インスタンスは「実体」

クラスを理解する最も有名な例えが**「設計図」**です。

例えば、「たい焼き」を考えてみましょう。たい焼きの「型」がクラス(設計図)です。この型を使えば、あんこ入りのたい焼きや、クリーム入りのたい焼きを何個も作れますよね。この、型から作られた一つひとつのたい焼きがインスタンス(実体)です。

  • クラス (Class): 設計図。データ構造や振る舞いの定義。
  • インスタンス (Instance): 設計図から作られた実体。オブジェクトとも呼ばれます。

Pythonでは、この「設計図」を一度定義すれば、そこから同じ構造を持つ「実体」を効率的にたくさん作れるのです。

Pythonクラスの基本的な書き方

それでは、実際にクラスを書いてみましょう。

class キーワードでクラス(設計図)を定義する

クラスはclassキーワードを使って定義します。クラス名の最初の文字は、慣習的に大文字にするのが一般的です(例: MyClass)。

# Dogという名前のクラスを定義する
class Dog:
    pass # passは「何もしない」という意味。中身が空の場合に記述する。

これだけで、Dogという名前のクラス(設計図)が完成しました。まだ中身は空っぽですが、立派なクラスです。

インスタンス化:設計図からオブジェクト(実体)を作る

次に、定義したクラス(設計図)からインスタンス(実体)を作ります。この操作をインスタンス化と呼びます。

書き方は簡単で、クラス名の後ろに()をつけます。

class Dog:
    pass

# Dogクラスからインスタンスを生成し、変数pochiに代入する
pochi = Dog()

# pochiがDogクラスのインスタンスであることを確認する
print(pochi)
# <__main__.Dog object at 0x10a5a3e50> のような出力が得られる
print(type(pochi))
# <class '__main__.Dog'>

pochi = Dog()の部分で、Dogクラスのインスタンスが生成され、変数pochiに代入されました。これで、pochiという名前の「犬」が1匹誕生したイメージです。

最重要!__init__ と self を理解しよう

ここがクラス学習の最初のつまずきポイントです。しかし、役割さえ分かれば全く難しくありません。

__init__ とは?インスタンス生成時に実行される初期化メソッド

__init__は、インスタンスが生成された時に自動的に呼び出される、初期化のための特別なメソッドです。このようなメソッドをコンストラクタと呼びます。

アンダースコア(_)が2つずつ前後についているのが特徴です。

__init__メソッドを使うと、名前や年齢のように、インスタンスごとに異なる初期値を設定できます。

class Dog:
    # インスタンス生成時に呼び出される初期化メソッド
    def __init__(self, name, age):
        print(f"犬が生まれました!名前は{name}、年齢は{age}歳です。")
        self.name = name # 属性nameに引数nameの値を設定
        self.age = age   # 属性ageに引数ageの値を設定

# インスタンス化する際に、__init__メソッドの引数を渡す
# selfは自動的に渡されるので、nameとageの値を渡す
pochi = Dog("ポチ", 5) 
# 出力: 犬が生まれました!名前はポチ、年齢は5歳です。

hachi = Dog("ハチ", 3)
# 出力: 犬が生まれました!名前はハチ、年齢は3歳です。

Dog("ポチ", 5)のようにインスタンス化すると、__init__メソッドが自動的に呼ばれ、引数として渡した "ポチ"5 がそれぞれ nameage にセットされます。

self とは?インスタンス自身を指す特別な引数

selfは、インスタンス自身を指す特別な引数です。クラス内で定義するメソッドの最初の引数には、必ずselfを書くルールになっています。

self.name = nameというコードは、「このインスタンス自身のnameという変数に、引数で受け取ったnameの値を代入してください」という意味になります。

これにより、pochinameは「ポチ」、hachinameは「ハチ」というように、各インスタンスが自分自身のデータを保持できるのです。

selfという名前は慣習であり、別の名前(例: this)でも動きますが、必ずselfと書くのがPythonのルールなので、素直に従いましょう。

クラスのデータ「属性」と振る舞い「メソッド」

クラスはデータ(属性)と振る舞い(メソッド)をまとめたものです。

属性(インスタンス変数)でデータを管理する

__init__内で self.変数名 のように定義した変数を属性(アトリビュート)やインスタンス変数と呼びます。これは、インスタンスごとに保持されるデータです。

属性には、インスタンス.属性名の形でアクセスできます。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

pochi = Dog("ポチ", 5)

# 属性にアクセスして値を取得する
print(pochi.name) # 出力: ポチ
print(pochi.age)  # 出力: 5

# 属性の値を変更することも可能
pochi.age = 6
print(f"{pochi.name}は{pochi.age}歳になりました。") # 出力: ポチは6歳になりました。

メソッドを定義して振る舞いを追加する

クラス内に定義された関数のことをメソッドと呼びます。メソッドは、そのクラスのインスタンスが行う「振る舞い」や「操作」を定義します。

メソッドの定義方法は関数とほぼ同じですが、第一引数に必ずselfを受け取る点が異なります。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 鳴く(bark)という振る舞いをメソッドとして定義
    def bark(self):
        print(f"{self.name}: ワン!")

    # 自己紹介するメソッド
    def introduce(self):
        print(f"ぼくの名前は{self.name}です。{self.age}歳です。")

pochi = Dog("ポチ", 5)

# メソッドを呼び出す
pochi.bark() # 出力: ポチ: ワン!
pochi.introduce() # 出力: ぼくの名前はポチです。5歳です。

pochi.bark()のようにメソッドを呼び出すと、Pythonが自動的にpochiインスタンス自身を第一引数selfとして渡してくれます。そのため、メソッド内ではself.nameのようにして、そのインスタンスが持つ属性にアクセスできるのです。

【発展】クラスの機能を再利用する「継承」

最後に、少し発展的な内容である継承に触れます。

継承とは、あるクラス(親クラス)の機能を引き継いで、新しいクラス(子クラス)を作成する仕組みです。これにより、コードの再利用性が高まります。

継承の基本的な書き方とメリット

例えば、Dogクラスを継承して、特別な能力を持つSuperDogクラスを作ってみましょう。

クラス定義時に class 子クラス名(親クラス名): のように書きます。

# 親クラス
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.name}: ワン!")

# Dogクラスを継承した子クラス
class SuperDog(Dog):
    # 子クラスで新しいメソッドを追加
    def fly(self):
        print(f"{self.name}は空を飛んだ!")

# SuperDogクラスをインスタンス化
super_pochi = SuperDog("スーパーポチ", 10)

# 親クラス(Dog)のメソッドも使える
super_pochi.bark() # 出力: スーパーポチ: ワン!

# 子クラスで追加したメソッドも使える
super_pochi.fly() # 出力: スーパーポチは空を飛んだ!

SuperDogDogクラスを継承しているので、Dogクラスが持つ__init__barkメソッドをそのまま利用できます。その上で、flyという新しいメソッドを追加できました。

このように、継承を使うと、共通の機能を親クラスにまとめておくことで、コードの重複を減らし、効率的に開発を進めることができます。

まとめ

今回は、Pythonのクラスの基本的な概念から使い方までを解説しました。

  • クラスは「設計図」で、インスタンスはそこから作られる「実体」。
  • クラスは class キーワードで定義する。
  • __init__ は、インスタンス生成時に呼ばれる初期化メソッド(コンストラクタ)
  • self は、インスタンス自身を指すおまじない。メソッドの第一引数に必ず書く。
  • 属性はインスタンスが持つデータ (self.nameなど)。
  • メソッドはインスタンスの振る舞いを定義した関数。
  • 継承を使うと、既存のクラスの機能を引き継いで新しいクラスを作れる。

クラスは、一度理解してしまえば、Pythonプログラミングの幅を大きく広げてくれる強力な武器になります。まずはこの記事のコードを写経するところから始めて、少しずつクラスの扱いに慣れていきましょう。

コメント

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