Python 3でのクラスの作成とオブジェクトの定義は、オブジェクト指向プログラミング(OOP)の基礎を理解するために非常に重要な概念です。ここでは、クラスの作成方法、インスタンスの生成方法、メソッドの定義、コンストラクタの使用などについて、Pythonにおけるオブジェクト指向の基本を包括的に解説します。
1. クラスの定義
Pythonでは、class
キーワードを使用してクラスを定義します。クラスは、属性(変数)とメソッド(関数)のセットとして機能します。以下に、基本的なクラスの定義の例を示します。

pythonclass Car:
# クラス変数
wheels = 4
# メソッド(関数)
def __init__(self, make, model, year):
# インスタンス変数
self.make = make
self.model = model
self.year = year
def display_info(self):
return f"{self.year} {self.make} {self.model}"
2. コンストラクタ __init__
メソッド
__init__
メソッドは、Pythonのクラスでインスタンスを作成する際に呼び出される特殊なメソッドです。このメソッドは、オブジェクトが作成されるときに初期化を行います。self
引数は、そのインスタンス自身を指します。
上記の Car
クラスでは、make
、model
、year
という属性をインスタンス変数として定義しており、コンストラクタ内でこれらの属性に初期値を設定しています。
3. インスタンスの作成
クラスを定義した後、そのクラスのインスタンス(オブジェクト)を作成することができます。インスタンスは、クラスを基にして個別のオブジェクトを作成するためのものです。
pythonmy_car = Car("Toyota", "Corolla", 2020)
print(my_car.display_info()) # 出力: 2020 Toyota Corolla
上記のコードでは、Car
クラスのインスタンスである my_car
を作成し、そのインスタンスに display_info()
メソッドを呼び出して情報を表示しています。
4. メソッドの定義
クラス内で定義された関数は、そのクラスのメソッドになります。メソッドは、通常、最初の引数として self
を取ります。これにより、メソッドはインスタンスの属性や他のメソッドにアクセスできるようになります。
pythonclass Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
return f"{self.name} says Woof!"
# インスタンスを作成
dog = Dog("Rex", 5)
print(dog.bark()) # 出力: Rex says Woof!
この例では、Dog
クラスが定義されており、bark
メソッドはインスタンスの name
属性を利用して「Woof!」というメッセージを返します。
5. 継承
Pythonでは、既存のクラスを基に新しいクラスを作成することができます。これを継承と呼びます。継承を使用すると、親クラスの属性やメソッドを子クラスで再利用することができます。
pythonclass Animal:
def __init__(self, name):
self.name = name
def speak(self):
return f"{self.name} makes a sound."
class Cat(Animal):
def __init__(self, name, color):
# 親クラスのコンストラクタを呼び出し
super().__init__(name)
self.color = color
def speak(self):
return f"{self.name} says Meow!"
# インスタンスを作成
cat = Cat("Whiskers", "Black")
print(cat.speak()) # 出力: Whiskers says Meow!
この例では、Cat
クラスが Animal
クラスを継承し、speak
メソッドをオーバーライドしています。super().__init__(name)
を使用して、親クラスのコンストラクタを呼び出しています。
6. クラス変数とインスタンス変数
クラス変数は、すべてのインスタンスで共有される変数です。インスタンス変数は、各インスタンスに固有の変数です。
pythonclass Student:
# クラス変数
school_name = "ABC High School"
def __init__(self, name, grade):
# インスタンス変数
self.name = name
self.grade = grade
# インスタンスを作成
student1 = Student("Taro", "10th Grade")
student2 = Student("Jiro", "9th Grade")
print(student1.school_name) # 出力: ABC High School
print(student2.school_name) # 出力: ABC High School
この例では、school_name
はクラス変数であり、すべてのインスタンスで共通です。一方、name
と grade
はインスタンス変数であり、それぞれのインスタンスに固有の値を持っています。
7. クラスメソッドとスタティックメソッド
クラスメソッドは、クラス自体を最初の引数として受け取ります(通常 cls
)。クラスメソッドを使用すると、インスタンス化せずにクラスから直接メソッドを呼び出すことができます。
pythonclass MyClass:
@classmethod
def class_method(cls):
print(f"Calling class method from {cls}")
MyClass.class_method() # 出力: Calling class method from
スタティックメソッドは、インスタンスやクラスの状態にアクセスすることなく、単独で動作するメソッドです。
pythonclass Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(5, 3)) # 出力: 8
8. プライベート変数とメソッド
Pythonでは、プライベートな属性やメソッドを作成するために、名前の前にアンダースコアを2つ追加します(例: __variable
)。これにより、その属性やメソッドは外部からアクセスできなくなります。
pythonclass Secret:
def __init__(self):
self.__private = "This is private"
def get_private(self):
return self.__private
secret = Secret()
print(secret.get_private()) # 出力: This is private
9. 属性とメソッドのカスタマイズ
Pythonでは、特殊メソッド(ダンダーメソッド)を定義することで、クラスの動作をカスタマイズできます。例えば、__str__
メソッドを定義すると、print()
でオブジェクトを表示する際の挙動を変更できます。
pythonclass Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} is {self.age} years old."
person = Person("Alice", 30)
print(person) # 出力: Alice is 30 years old.
結論
Pythonにおけるクラスとオブジェクトの作成は、オブジェクト指向プログラミングの基礎を学ぶための重要なステップです。クラスを定義し、インスタンスを作成し、メソッドを活用することで、より構造化された、再利用可能なコードを書くことができます。継承、カスタムメソッド、プライベート属性など、クラスのさまざまな機能を使いこなすことで、より高度なプログラムを作成できるようになります。