<一覧に戻る

インターフェースとしてのプロトコル(Python 3.8以降)

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

コード解説

  1. プロトコルの定義:
  2. Drawableというプロトコルを定義し、drawメソッドを持つことを期待しています。

  3. プロトコルに従うクラス:

  4. CircleおよびSquareクラスは、Drawableプロトコルに従っています。どちらのクラスもdrawメソッドを実装しています。

  5. 関数の定義:

  6. render関数は、Drawableプロトコルを引数に受け取り、与えられたオブジェクトのdrawメソッドを呼び出します。

  7. 実行:

  8. CircleSquareのインスタンスを作成し、それぞれをrender関数に渡すことで、適切なdrawメソッドが呼び出され、各図形が描画されることを示しています。

プロトコルの利点

  • 柔軟性: プロトコルを使用することで、異なるクラスオブジェクトを同じ関数に渡すことができ、動的な型付けの特性を活かすことができます。
  • 静的型チェック: mypyなどの静的型チェッカーを使用することで、実行前に型の整合性を検証できるため、バグを早期に発見できます。

まとめ

Python 3.8以降のプロトコルは、インターフェースの概念を取り入れ、型安全性を高めるための強力なツールです。プロトコルを利用することで、クラスの設計がより柔軟になり、コードの再利用性が向上します。次回は、抽象クラスや抽象メソッドについて学びましょう。

出力結果: