Python 3.8以降では、プロトコルという機能が追加され、インターフェースのような役割を果たすことができます。プロトコルは、特定のメソッドや属性を持つことを期待される型を定義するための方法であり、これにより柔軟性が向上し、型ヒントを使用した静的型チェックが可能になります。
プロトコルは、任意のクラスが特定のメソッドや属性を持つことを意味するインターフェースのようなものです。Pythonのtyping
モジュールによって提供され、型ヒントの一部として使用されます。
プロトコルを定義するためには、typing
モジュールのProtocol
を使用します。以下に基本的な構文を示します。
from typing import Protocol
class MyProtocol(Protocol):
def method_a(self) -> str:
...
def method_b(self, value: int) -> None:
...
ここでは、プロトコルを使用してインターフェースを定義し、それに従うクラスを作成する例を示します。
from typing import Protocol
# プロトコルの定義
class Drawable(Protocol):
def draw(self) -> None:
...
# プロトコルに従うクラス
class Circle:
def draw(self) -> None:
print("Drawing a Circle")
class Square:
def draw(self) -> None:
print("Drawing a Square")
# プロトコルを利用した関数
def render(shape: Drawable) -> None:
shape.draw()
# クラスのインスタンスを作成
circle = Circle()
square = Square()
# render関数に渡す
render(circle) # 出力: Drawing a Circle
render(square) # 出力: Drawing a Square
Drawable
というプロトコルを定義し、draw
メソッドを持つことを期待しています。
プロトコルに従うクラス:
Circle
およびSquare
クラスは、Drawable
プロトコルに従っています。どちらのクラスもdraw
メソッドを実装しています。
関数の定義:
render
関数は、Drawable
プロトコルを引数に受け取り、与えられたオブジェクトのdraw
メソッドを呼び出します。
実行:
Circle
とSquare
のインスタンスを作成し、それぞれをrender
関数に渡すことで、適切なdraw
メソッドが呼び出され、各図形が描画されることを示しています。mypy
などの静的型チェッカーを使用することで、実行前に型の整合性を検証できるため、バグを早期に発見できます。Python 3.8以降のプロトコルは、インターフェースの概念を取り入れ、型安全性を高めるための強力なツールです。プロトコルを利用することで、クラスの設計がより柔軟になり、コードの再利用性が向上します。次回は、抽象クラスや抽象メソッドについて学びましょう。