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 に "ポチ"、age に 3 がセットされます。
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()
私の名前はポチです
私の名前はハナです
dog1 と dog2 はそれぞれ別のインスタンスです。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 デコレータを使います。self も cls も受け取らず、クラスやインスタンスに依存しない処理をまとめるときに使います。
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にクラスのコードを書かせることは増えています。ただ、self や super() の意図が読めないと、生成されたコードに誤りがあっても気づきにくくなります。クラスの構造を理解しておくと、AI出力を確認・修正する場面で役立ちます。
まとめ
この記事では、Pythonのクラスについて以下の点を解説しました。
classでクラスを定義し、__init__でインスタンス生成時の初期化処理を書くselfはインスタンス自身を指し、インスタンス変数はself.○○で管理する- クラス変数はクラス全体で共有、インスタンス変数はインスタンスごとに独立
@classmethodと@staticmethodで用途に合わせてメソッドを使い分ける- 継承は
class 子クラス(親クラス)で書き、親の処理を引き継ぐときはsuper()を使う
クラスを使えるようになると、大きなプログラムを整理しやすくなります。まずは __init__ と self の動きを手元で確認しながら慣れていくとスムーズです。
Pythonをどこまで学ぶべきか・独学で進めるべきかを考えているなら、AIが普及した時代にプログラミングスクールは必要か?も参考になります。