オブジェクト指向プログラミングの三大特性:カプセル化、継承、ポリモーフィズム
ポリモーフィズム:他のプログラミング言語では、ポリモーフィズムは継承に依存し、親クラスの参照を通じて子クラスのメソッドにアクセスします。定義時に親クラス型のオブジェクトを宣言しますが、実際に渡されるのは子クラス型のオブジェクトです。具体的な子クラスの型に基づいて、子クラスでオーバーライドされた親クラスと同名のメソッドにアクセスし、同じメソッドに対して、渡される子クラスオブジェクトが異なることで異なる動作を生み出します。
Pythonでは、完全に継承に依存するわけではありませんが、基本的には同様です。呼び出し時に渡されたオブジェクトが何であるかを確認し、対応するメソッドを呼び出します。
クラス属性:クラス全体で共有され、このクラスからインスタンス化されたすべてのオブジェクトでも共有されます。メモリ空間を1つだけ占有します。
インスタンス属性:selfにバインドされ、クラスからインスタンス化されたオブジェクトが保持します。オブジェクトをインスタンス化するたびに、インスタンス属性のための個別のメモリ空間が確保されます。
アクセス:クラスまたはインスタンスオブジェクトからアクセスできます。
変更:クラスからのみ変更できます。インスタンスオブジェクトから変更しようとすると、デフォルトでインスタンスオブジェクトに同名のインスタンス属性が宣言され、クラス属性の値は変更されません。
クラスメソッド:@classmethodデコレーターで修飾され、特定のメソッドがクラスメソッドであることを示します。最初のパラメータはクラスオブジェクトでなければならず、デフォルトではclsです。通常は(プライベート)クラス属性の操作に使用されます。
Python 3.13.5 (tags/v3.13.5:6cb20a2, Jun 11 2025, 16:15:46) [MSC v.1943 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Vehicle(object):
... __wheel_count = 4
... @classmethod
... def get_wheel_info(cls):
... return f"標準的な車輪数: {cls.__wheel_count}"
...
>>> class Car(Vehicle):
... __wheel_count = 4
... @classmethod
... def get_wheel_info(cls):
... return f"自動車の車輪数: {cls.__wheel_count}"
...
>>> class Motorcycle(Vehicle):
... __wheel_count = 2
... @classmethod
... def get_wheel_info(cls):
... return f"バイクの車輪数: {cls.__wheel_count}"
...
>>> my_car = Car()
>>> my_bike = Motorcycle()
>>> print(my_car.get_wheel_info())
自動車の車輪数: 4
>>> print(my_bike.get_wheel_info())
バイクの車輪数: 2
>>>
静的メソッド:@staticmethodデコレーターで修飾されます。クラスもインスタンスも渡す必要がなく、selfやclsの引数もありません。純粋な機能関数です。不要なメモリ使用とパフォーマンス消費を削減できます。
>>> class Geometry():
... @staticmethod
... def calculate_circle_area(radius):
... import math
... return math.pi * radius ** 2
...
... @staticmethod
... def calculate_rectangle_area(width, height):
... return width * height
...
>>> radius_value = 5
>>> circle_result = Geometry.calculate_circle_area(radius_value)
>>> print(f"円の面積: {circle_result:.2f}")
円の面積: 78.54
>>> rect_result = Geometry.calculate_rectangle_area(3, 4)
>>> print(f"長方形の面積: {rect_result}")
長方形の面積: 12
>>>