【Python】クラス定義について詳細解説
- クラスの定義とは
- 基本的なクラスの定義
- コンストラクタ(__init__メソッド)
- メソッドの定義
- インスタンス変数とクラス変数
- クラスの継承
- 特殊メソッド(マジックメソッド)
- 静的メソッドとクラスメソッド
- dataclassを使ったクラスの定義
クラスの定義とは
クラスはオブジェクト指向プログラミングの基礎となる概念です。クラスを使用すると、データ(属性)とそのデータを操作する関数(メソッド)を一つにまとめることができます。Pythonでは、class
キーワードを使ってクラスを定義します。
基本的なクラスの定義
Pythonでクラスを定義する基本的な構文は次の通りです。
class クラス名: def __init__(self): pass
例えば、単純なクラスを定義してみましょう。
class Person: pass
このクラスは何の機能も持ちませんが、Person()
を使ってオブジェクトを作成できます。
コンストラクタ(__init__メソッド)
クラスのインスタンスを作成するときに自動的に呼び出されるのが __init__
メソッド(コンストラクタ)です。
class Person: def __init__(self, name, age): self.name = name self.age = age
このように定義すると、オブジェクトを作成するときに名前と年齢を指定できます。
p = Person("太郎", 30) print(p.name) # 出力: 太郎 print(p.age) # 出力: 30
メソッドの定義
クラスには、データを操作するためのメソッドを定義できます。
class Person: def __init__(self, name, age): self.name = name self.age = age def greet(self): return f"こんにちは、私は{self.name}です。"
このように定義すると、オブジェクトからメソッドを呼び出せます。
p = Person("太郎", 30) print(p.greet()) # 出力: こんにちは、私は太郎です。
インスタンス変数とクラス変数
インスタンスごとに異なる値を持つのがインスタンス変数、クラス全体で共有するのがクラス変数です。
class Person: species = "Homo sapiens" # クラス変数 def __init__(self, name): self.name = name # インスタンス変数
インスタンスごとに name
は異なりますが、species
は全インスタンスで共有されます。
クラスの継承
クラスは他のクラスを継承することで、機能を引き継ぐことができます。
class Animal: def speak(self): return "何かを話す" class Dog(Animal): def speak(self): return "ワンワン!"
dog = Dog() print(dog.speak()) # 出力: ワンワン!
特殊メソッド(マジックメソッド)
Pythonには特定の目的を持つ特殊メソッド(マジックメソッド)が多数用意されています。
class Point: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Point(self.x + other.x, self.y + other.y) def __repr__(self): return f"Point({self.x}, {self.y})"
p1 = Point(1, 2) p2 = Point(3, 4) print(p1 + p2) # 出力: Point(4, 6)
静的メソッドとクラスメソッド
静的メソッド(@staticmethod
)とクラスメソッド(@classmethod
)を使うことで、インスタンスに依存しないメソッドを定義できます。
class Math: @staticmethod def add(a, b): return a + b print(Math.add(3, 4)) # 出力: 7
dataclassを使ったクラスの定義
dataclass
を使うと、簡潔にデータを扱うクラスを定義できます。
from dataclasses import dataclass @dataclass class Person: name: str age: int
p = Person("太郎", 30) print(p) # 出力: Person(name='太郎', age=30)