【Python】コンストラクタの仕組み【クラス】
- クラスとは
- コンストラクタ(__init__メソッド)とは
- インスタンス変数とクラス変数
- コンストラクタのデフォルト値
- コンストラクタのオーバーロード
- 複数のコンストラクタを定義する方法
- クラスの継承とコンストラクタ
- まとめ
クラスとは
クラスは、オブジェクト指向プログラミング(OOP)の重要な概念の一つであり、データとそれを操作するメソッドを一つの単位としてまとめたものです。
Pythonでは、class
キーワードを使ってクラスを定義します。
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
my_car = Car("Toyota", "Corolla")
print(my_car.brand) # Toyota
print(my_car.model) # Corolla
コンストラクタ(__init__メソッド)とは
Pythonでは、オブジェクトが生成されるときに自動的に呼び出される特別なメソッドが__init__
メソッド(コンストラクタ)です。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("Alice", 30)
print(p1.name) # Alice
print(p1.age) # 30
インスタンス変数とクラス変数
クラスの属性には、インスタンス変数とクラス変数があります。
- インスタンス変数:オブジェクトごとに異なる値を持つ。
- クラス変数:クラス全体で共有される。
class Dog:
species = "Canis familiaris" # クラス変数
def __init__(self, name):
self.name = name # インスタンス変数
dog1 = Dog("Rex")
dog2 = Dog("Bella")
print(dog1.species) # Canis familiaris
print(dog2.species) # Canis familiaris
print(dog1.name) # Rex
print(dog2.name) # Bella
コンストラクタのデフォルト値
コンストラクタではデフォルト値を設定することも可能です。
class Employee:
def __init__(self, name="Unknown", salary=30000):
self.name = name
self.salary = salary
e1 = Employee()
e2 = Employee("John", 50000)
print(e1.name, e1.salary) # Unknown 30000
print(e2.name, e2.salary) # John 50000
コンストラクタのオーバーロード
Pythonでは、C++やJavaのように明示的なオーバーロードはできませんが、デフォルト値や可変引数を使って似たようなことができます。
class Product:
def __init__(self, name, price=100, stock=0):
self.name = name
self.price = price
self.stock = stock
p1 = Product("Laptop", 1500, 10)
p2 = Product("Mouse")
print(p1.name, p1.price, p1.stock) # Laptop 1500 10
print(p2.name, p2.price, p2.stock) # Mouse 100 0
複数のコンストラクタを定義する方法
Pythonには明示的なコンストラクタのオーバーロードはありませんが、クラスメソッドを利用して複数のコンストラクタを持たせることができます。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
return cls(name, 2024 - birth_year)
p1 = Person("Alice", 30)
p2 = Person.from_birth_year("Bob", 1995)
print(p1.name, p1.age) # Alice 30
print(p2.name, p2.age) # Bob 29
クラスの継承とコンストラクタ
親クラス(スーパークラス)のコンストラクタを子クラス(サブクラス)で呼び出すことができます。
class Animal:
def __init__(self, name):
self.name = name
class Cat(Animal):
def __init__(self, name, breed):
super().__init__(name) # 親クラスのコンストラクタを呼ぶ
self.breed = breed
c = Cat("Whiskers", "Siamese")
print(c.name, c.breed) # Whiskers Siamese
まとめ
- クラスはオブジェクトを定義する枠組み。
- コンストラクタ(
__init__
)はオブジェクトの初期化に使う。 - インスタンス変数はオブジェクトごとに異なるが、クラス変数は共有される。
- デフォルト値やクラスメソッドを使ってコンストラクタを柔軟に定義できる。
- 継承を使えば親クラスのコンストラクタを活用できる。