【Python】コンストラクタの仕組み【クラス】

【Python】コンストラクタの仕組み【クラス】

クラスとは

クラスは、オブジェクト指向プログラミング(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__)はオブジェクトの初期化に使う。
  • インスタンス変数はオブジェクトごとに異なるが、クラス変数は共有される。
  • デフォルト値やクラスメソッドを使ってコンストラクタを柔軟に定義できる。
  • 継承を使えば親クラスのコンストラクタを活用できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です