フリーキーズ | 独学プログラミング

Pythonのクラス入門!基本的な書き方、そしてオブジェクト指向の基礎

最終更新日
リンドくん

リンドくん

たなべ先生、Pythonの「クラス」って何ですか?
なんだか難しそうで…

たなべ

たなべ

クラスは最初は難しく感じるかもしれないけど、実はとても役立つ概念なんだ。
例えるなら「設計図」のようなもので、これを使うと似たようなデータと機能をまとめて管理できるんだよ。

プログラミングを学んでいくと、必ず出会う概念が「クラス」です。
特にPythonのような「オブジェクト指向プログラミング言語」では、クラスの理解がプログラミングの幅を大きく広げてくれます。

しかし、初心者にとってクラスの概念は少し抽象的で、なかなか理解しづらいもの。
「なぜクラスを使うの?」「どんな時に役立つの?」といった疑問をお持ちの方も多いのではないでしょうか。

この記事では、Pythonのクラスについて、初心者の方でも理解できるよう、具体例を交えながら分かりやすく解説していきます。
クラスの基本的な書き方から、実際の活用シーンまで、段階的に学んでいきましょう。

クラスとは

リンドくん

リンドくん

でも先生、そもそもなぜクラスが必要なんですか?
普通に関数とか変数を使えばいいんじゃ…

たなべ

たなべ

確かにそう思うよね。例えば、RPGゲームのキャラクターを考えてみよう。
名前、HP、攻撃力、防御力…これらをバラバラの変数で管理するより、「キャラクター」というまとまりで扱えた方が便利だと思わない?

クラスの基本概念

クラス(Class)とは、データと機能をひとまとめにした設計図です。
オブジェクト指向プログラミングの中心的な概念で、現実世界のモノや概念をプログラムで表現するための強力な道具となります。

クラスを使うことで得られる主なメリットには以下のようなものがあります。

  • 関連するデータと機能をまとめられる(カプセル化)
  • コードの再利用性が高まる
  • データの管理がしやすくなる
  • 大規模なプログラムが書きやすくなる

なぜクラスが必要なのか

例えば、学生管理システムを作るとしましょう。
学生には「名前」「学年」「成績」などの情報があります。これらを個別の変数で管理すると以下のようになります。

student1_name = "山田太郎"
student1_grade = 2
student1_score = 85

student2_name = "佐藤花子"
student2_grade = 1
student2_score = 92

学生が増えるたびに新しい変数を作る必要があり、非常に冗長です。
また、学生に関連する機能(例:成績を表示する)も別々に実装する必要があります。

クラスを使うと、これらをまとめて扱うことができます。

class Student:
    def __init__(self, name, grade, score):
        self.name = name
        self.grade = grade
        self.score = score
    
    def display_info(self):
        print(f"名前: {self.name}, 学年: {self.grade}, 成績: {self.score}")

# 使用例
student1 = Student("山田太郎", 2, 85)
student2 = Student("佐藤花子", 1, 92)

student1.display_info()  # 名前: 山田太郎, 学年: 2, 成績: 85

このように、クラスを使えば関連するデータと機能を論理的にまとめることができ、コードの見通しが良くなります。

Pythonでのクラスの書き方

リンドくん

リンドくん

クラスの便利さはわかってきました!
でも、具体的にどう書けばいいんですか?

たなべ

たなべ

書き方はシンプルだよ。まずは基本的な形から見ていこうか。
Pythonのクラスは「class」というキーワードから始まるんだ。

クラスの基本構文

Pythonでクラスを定義する基本的な構文は次のとおりです。

class クラス名:
    # コンストラクタ(初期化メソッド)
    def __init__(self, パラメータ1, パラメータ2, ...):
        self.属性1 = パラメータ1
        self.属性2 = パラメータ2
        # ...
    
    # メソッド(クラスの機能)
    def メソッド名(self, パラメータ):
        # 処理
        return 結果

ここで重要な要素を説明します。

  • class キーワード = クラスの定義を開始します
  • クラス名 = 慣習的に大文字で始まる名前をつけます(例:Student, Car
  • __init__ メソッド = クラスからオブジェクトを作る際に自動的に呼ばれる特殊メソッドです(コンストラクタとも呼ばれます)
  • self = クラス自身を参照するための変数です。クラス内のメソッドの第一引数には必ずselfを指定します
  • 属性 = クラスが持つデータのことです(例:self.name, self.grade
  • メソッド = クラスが持つ機能(関数)のことです

シンプルな例 電卓クラス

具体例を通して理解を深めましょう。簡単な電卓クラスを作ってみます。

class Calculator:
    # 初期化メソッド(コンストラクタ)
    def __init__(self):
        self.result = 0
    
    # 足し算メソッド
    def add(self, num):
        self.result += num
        return self.result
    
    # 引き算メソッド
    def subtract(self, num):
        self.result -= num
        return self.result
    
    # 掛け算メソッド
    def multiply(self, num):
        self.result *= num
        return self.result
    
    # 割り算メソッド
    def divide(self, num):
        if num != 0:  # ゼロ除算を防ぐ
            self.result /= num
        else:
            print("エラー: 0で割ることはできません")
        return self.result
    
    # 結果をリセットするメソッド
    def clear(self):
        self.result = 0
        return self.result

# 使用例
calc = Calculator()  # Calculatorクラスのインスタンス(実体)を作成
print(calc.add(5))      # 5
print(calc.add(3))      # 8
print(calc.multiply(2))  # 16
print(calc.subtract(4))  # 12
print(calc.divide(3))    # 4.0
print(calc.clear())      # 0

このように、Calculatorクラスを定義することで、計算結果を保持しながら様々な演算を行うことができます。
各メソッドは計算結果を内部状態(self.result)として保持しています。

クラスのインスタンス化とメソッド呼び出し

リンドくん

リンドくん

クラスを作っただけじゃ使えないんですよね?
どうやって実際に使うんですか?

たなべ

たなべ

その通り!クラスは設計図だから、実際に使うには「インスタンス」というものを作る必要があるんだ。
例えるなら、クラスはケーキのレシピで、インスタンスは実際に焼いたケーキみたいなものだよ。

インスタンスとは何か

クラスはあくまで「設計図」です。
実際にそのクラスを使うためには、クラスから「インスタンス」(オブジェクト)を作成する必要があります。
これを「インスタンス化」または「オブジェクト化」と呼びます。

インスタンス化は次のように行います。

インスタンス名 = クラス名(引数1, 引数2, ...)

例えば、先ほどのStudentクラスのインスタンスを作成する場合はこうなります。

student1 = Student("山田太郎", 2, 85)

ここでstudent1Studentクラスのインスタンスであり、「山田太郎」という名前、2年生、成績85点という属性を持ちます。

メソッドの呼び出し方

インスタンスのメソッドは、ドット(.)を使って呼び出します。

インスタンス名.メソッド名(引数)

例えば、以下のとおりです。

student1.display_info()  # 名前: 山田太郎, 学年: 2, 成績: 85

複数インスタンスの作成

クラスの強みは、同じ「設計図」から複数の異なるオブジェクトを作れることです。

class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed
    
    def bark(self):
        print(f"{self.name}: ワンワン!")

# 複数のインスタンスを作成
dog1 = Dog("ポチ", "柴犬")
dog2 = Dog("ハチ", "秋田犬")
dog3 = Dog("レオ", "ゴールデンレトリバー")

# それぞれのインスタンスのメソッドを呼び出す
dog1.bark()  # ポチ: ワンワン!
dog2.bark()  # ハチ: ワンワン!
dog3.bark()  # レオ: ワンワン!

このように、同じクラスから複数の異なるインスタンスを作成でき、それぞれが独自の属性を持ちつつ、同じメソッドを使うことができます。

クラスの継承

リンドくん

リンドくん

既存のクラスにちょっとだけ機能を追加したいときはどうするんですか?
全部書き直さないといけないんですか?

たなべ

たなべ

いい質問だね!そんなときには「継承」という機能が便利なんだ。
これを使えば、既存のクラスの機能を引き継ぎながら、新しい機能を追加できるんだよ。

継承とは

継承(Inheritance)とは、既存のクラス(親クラス・基底クラス)の機能を引き継ぎながら、新しいクラス(子クラス・派生クラス)を作る仕組みです。
これにより、コードの再利用性が高まります。

継承を使うと以下のようなメリットがあります。

  • 親クラスのメソッドや属性を子クラスでも使える
  • 親クラスのメソッドを子クラスで上書き(オーバーライド)できる
  • 子クラス独自のメソッドや属性を追加できる

継承の基本構文

class 子クラス名(親クラス名):
    # 子クラス独自のメソッドや属性
    pass

継承の例 動物クラス

例えば、「動物」という基本クラスがあり、そこから「犬」と「猫」というクラスを派生させる例を考えてみましょう。

# 親クラス(基底クラス)
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def eat(self):
        print(f"{self.name}が食事をしています")
    
    def sleep(self):
        print(f"{self.name}が眠っています")

# 子クラス(派生クラス)
class Dog(Animal):  # Animalクラスを継承
    def bark(self):  # 犬特有のメソッド
        print(f"{self.name}:ワンワン!")

# 別の子クラス
class Cat(Animal):  # Animalクラスを継承
    def meow(self):  # 猫特有のメソッド
        print(f"{self.name}:ニャー")
    
    # 親クラスのメソッドをオーバーライド(上書き)
    def sleep(self):
        print(f"{self.name}がゴロゴロ言いながら眠っています")

# 使用例
my_dog = Dog("ポチ", 3)
my_cat = Cat("タマ", 2)

my_dog.eat()    # Animalクラスから継承したメソッド
my_dog.bark()   # Dog独自のメソッド

my_cat.eat()    # Animalクラスから継承したメソッド
my_cat.meow()   # Cat独自のメソッド
my_cat.sleep()  # オーバーライドしたメソッド

このように、継承を使うことで基本的な機能は親クラスで一度定義するだけで済み、子クラスではそれぞれの特有の機能だけを追加すれば良いのです。

まとめ

リンドくん

リンドくん

クラスの使い方が少しわかってきました!
思ったより便利そうですね。

たなべ

たなべ

そうだよね!最初は難しく感じるかもしれないけど、慣れてくると「これはクラスで表現すると良さそうだな」と思えるようになるよ。
クラスを使いこなせると、プログラミングの可能性がグッと広がるんだ。ぜひ実際に手を動かして試してみてね!

この記事では、Pythonのクラスについて基本から学んできました。
クラスとは「データと機能をまとめた設計図」であり、オブジェクト指向プログラミングの中心的な概念です。

まとめると、クラスを使うことで以下のような恩恵を享受できます。

  • 関連するデータと機能をひとまとめにできる
  • コードの再利用性が高まる
  • 大規模なプログラムを効率的に書ける
  • 現実世界のものをプログラムで表現しやすくなる

初心者の方にとっては、最初は馴染みにくい概念かもしれませんが、使いこなせるようになると、プログラミングの表現力が大きく広がります。
特に大きなプロジェクトや、複数人での開発においては必須の知識となります。

まずは簡単なクラスから作成して、徐々に継承などの応用テクニックにも挑戦してみてください。
本格的なプログラマへの第一歩として、クラスの概念をしっかり身につけることをおすすめします。

関連するコンテンツ