注目キーワード
  1. Python
  2. コンペ

Pythonのクラスをオブジェクト指向プログラミング初心者向けに解説|__init__・self・インスタンス・継承の使い方

  • 2026年7月7日
  • 2026年7月7日
  • Python
  • 5回
  • 0件

Pythonのクラスとは

Pythonのクラスは、データと処理をひとまとまりにして定義する仕組みです。

関数(def)は処理だけをまとめるものですが、クラスは「データの状態」と「それに対する処理」を一緒に管理できます。この考え方をオブジェクト指向プログラミング(OOP)と呼びます。

たとえば「犬」を表すときに、名前・年齢・鳴き声などのデータと、「吠える」「走る」などの動作をまとめたものがクラスです。

関数の定義方法(def・引数・戻り値)については、Pythonの関数の作り方・書き方を初心者向けに解説で詳しく解説しています。

クラスの基本的な書き方

クラスは class キーワードで定義します。

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

    def bark(self):
        print(f"{self.name}が吠えました")

このコードを実行してインスタンスを作るには、次のように書きます。

dog1 = Dog("ポチ", 3)
dog1.bark()
ポチが吠えました

Dog("ポチ", 3) の部分でクラスからインスタンス(実体)を作成しています。インスタンスとは、クラスという設計図から作られた具体的なオブジェクトのことです。

__init__ と self の役割

__init__ はコンストラクタ

__init__ は、インスタンスを作成したときに自動で呼ばれる特別なメソッドです。コンストラクタとも呼ばれます。

インスタンスを作るときに渡した値を、そのインスタンス内部に保存する処理をここに書きます。

class Dog:
    def __init__(self, name, age):
        self.name = name   # インスタンス変数に値を保存
        self.age = age

Dog("ポチ", 3) と書いた瞬間に __init__ が呼ばれ、name"ポチ"age3 がセットされます。

self はインスタンス自身を指す

self は、そのインスタンス自身を指す変数です。

メソッドの第1引数には必ず self を書きます。これにより、self.name のようにインスタンスに紐づいたデータを参照・保存できます。

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

    def introduce(self):
        print(f"私の名前は{self.name}です")

dog1 = Dog("ポチ", 3)
dog2 = Dog("ハナ", 5)

dog1.introduce()
dog2.introduce()
私の名前はポチです
私の名前はハナです

dog1dog2 はそれぞれ別のインスタンスです。self のおかげで、それぞれが自分のデータを持てます。

インスタンス変数とクラス変数の違い

インスタンス変数

self.○○ の形で定義する変数です。インスタンスごとに別の値を持ちます。

class Dog:
    def __init__(self, name):
        self.name = name  # インスタンス変数

dog1 = Dog("ポチ")
dog2 = Dog("ハナ")

print(dog1.name)  # ポチ
print(dog2.name)  # ハナ
ポチ
ハナ

クラス変数

クラス全体で共有する変数です。self を使わず、クラスの直下に定義します。

class Dog:
    species = "イヌ科"  # クラス変数

    def __init__(self, name):
        self.name = name

dog1 = Dog("ポチ")
dog2 = Dog("ハナ")

print(dog1.species)  # イヌ科
print(dog2.species)  # イヌ科
print(Dog.species)   # イヌ科
イヌ科
イヌ科
イヌ科

クラス変数はどのインスタンスからも同じ値を参照できます。インスタンスが変わっても変わらない共通の属性に使います。

クラスメソッドと静的メソッド

通常のメソッド(インスタンスメソッド)のほかに、クラスメソッドと静的メソッドがあります。

クラスメソッド

@classmethod デコレータを使います。第1引数は self ではなく cls(クラス自身)を受け取ります。

class Dog:
    count = 0  # 何頭作られたか記録するクラス変数

    def __init__(self, name):
        self.name = name
        Dog.count += 1

    @classmethod
    def get_count(cls):
        print(f"現在の犬の数: {cls.count}頭")

dog1 = Dog("ポチ")
dog2 = Dog("ハナ")

Dog.get_count()
現在の犬の数: 2頭

静的メソッド

@staticmethod デコレータを使います。selfcls も受け取らず、クラスやインスタンスに依存しない処理をまとめるときに使います。

class Dog:
    @staticmethod
    def is_dog_name(name):
        return isinstance(name, str) and len(name) > 0

print(Dog.is_dog_name("ポチ"))   # True
print(Dog.is_dog_name(""))       # False
True
False

継承と super の使い方

継承とは

既存のクラスを引き継いで、新しいクラスを作る仕組みです。引き継ぐ元のクラスを「親クラス(基底クラス)」、引き継いだ新しいクラスを「子クラス(派生クラス)」と呼びます。

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f"{self.name}が鳴きました")

class Dog(Animal):  # Animal を継承
    def fetch(self):
        print(f"{self.name}がボールを取ってきました")

dog = Dog("ポチ")
dog.speak()   # 親クラスのメソッドをそのまま使える
dog.fetch()
ポチが鳴きました
ポチがボールを取ってきました

super() で親クラスの処理を呼ぶ

子クラスで __init__ を定義するとき、親クラスの __init__ も実行したい場面があります。このときに super() を使います。

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 親クラスの __init__ を呼ぶ
        self.breed = breed      # 子クラス独自の属性を追加

dog = Dog("ポチ", "柴犬")
print(dog.name)   # 親から引き継いだ属性
print(dog.breed)  # 子クラスで追加した属性
ポチ
柴犬

super().__init__(name) を忘れると、親クラスで定義した self.name がセットされないため注意が必要です。

メソッドのオーバーライド

子クラスで同じ名前のメソッドを定義すると、親クラスのメソッドを上書き(オーバーライド)できます。

class Animal:
    def speak(self):
        print("動物が鳴きました")

class Dog(Animal):
    def speak(self):
        print("ワンワン!")

class Cat(Animal):
    def speak(self):
        print("ニャーニャー!")

dog = Dog()
cat = Cat()

dog.speak()
cat.speak()
ワンワン!
ニャーニャー!

よくあるミスと注意点

self を書き忘れる

メソッドの第1引数に self を書き忘れると、呼び出し時にエラーになります。

class Dog:
    def bark():  # self がない
        print("ワンワン")

dog = Dog()
dog.bark()
TypeError: Dog.bark() takes 0 positional arguments but 1 was given

メソッドを定義するときは、第1引数に必ず self を書きます。

class Dog:
    def bark(self):  # 正しい書き方
        print("ワンワン")

__init__ の中で self.○○ の代入を忘れる

__init__ 内で受け取った値を self.○○ に代入しないと、他のメソッドから参照できません。

class Dog:
    def __init__(self, name):
        name = name  # NG: self.name ではなくローカル変数に代入している

    def bark(self):
        print(self.name)  # AttributeError になる

dog = Dog("ポチ")
dog.bark()
AttributeError: 'Dog' object has no attribute 'name'

self.name = name と書くことで、インスタンス変数として保存されます。

super() の呼び出しを忘れる

継承時に子クラスで __init__ を上書きする場合、super().__init__() を忘れると親クラスの初期化が行われません。

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        # super().__init__(name) を忘れている
        self.breed = breed

dog = Dog("ポチ", "柴犬")
print(dog.name)  # AttributeError になる
AttributeError: 'Dog' object has no attribute 'name'

子クラスで __init__ を定義するときは、最初に super().__init__(...) を呼ぶのが基本的なパターンです。

AI時代での補足

AIにクラスのコードを書かせることは増えています。ただ、selfsuper() の意図が読めないと、生成されたコードに誤りがあっても気づきにくくなります。クラスの構造を理解しておくと、AI出力を確認・修正する場面で役立ちます。

まとめ

この記事では、Pythonのクラスについて以下の点を解説しました。

  • class でクラスを定義し、__init__ でインスタンス生成時の初期化処理を書く
  • self はインスタンス自身を指し、インスタンス変数は self.○○ で管理する
  • クラス変数はクラス全体で共有、インスタンス変数はインスタンスごとに独立
  • @classmethod@staticmethod で用途に合わせてメソッドを使い分ける
  • 継承は class 子クラス(親クラス) で書き、親の処理を引き継ぐときは super() を使う

クラスを使えるようになると、大きなプログラムを整理しやすくなります。まずは __init__self の動きを手元で確認しながら慣れていくとスムーズです。

Pythonをどこまで学ぶべきか・独学で進めるべきかを考えているなら、AIが普及した時代にプログラミングスクールは必要か?も参考になります。

最新情報をチェックしよう!