3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python `typing.Generic`を使って汎用的なクラスを定義する

Posted at

はじめに

Pythonでは、typingモジュールを使用して型ヒントを提供することができます。その中でもtyping.Genericは、汎用的なクラスを定義する際に非常に強力なツールです。この記事では、typing.Genericの使い方と、それを使って汎用的なクラスを定義する方法について説明します。

image.png

typing.Genericとは

typing.Genericは、型パラメータを持つクラスを定義するために使用されます。これにより、クラスの中で使用される型を柔軟に指定することができ、コードの再利用性と型安全性を高めることができます。

基本的な使い方

まず、簡単な例から見てみましょう。

from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, content: T):
        self.content = content

    def get_content(self) -> T:
        return self.content

この例では、Boxクラスが任意の型Tの内容を持つことができます。

実践的な例

次に、より実践的な例として、汎用的なデータベース接続クラスを定義してみましょう。

from typing import Generic, TypeVar, List, Dict

T = TypeVar('T')

class DatabaseConnection(Generic[T]):
    def __init__(self, connection_string: str):
        self.connection_string = connection_string

    def insert(self, item: T) -> None:
        # 実際のデータベース挿入ロジックをここに実装
        print(f"Inserting {item} into the database")

    def select(self, criteria: Dict[str, any]) -> List[T]:
        # 実際のデータベース選択ロジックをここに実装
        print(f"Selecting items with criteria: {criteria}")
        return []  # ダミーの空リストを返す

# 使用例
class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

user_db = DatabaseConnection[User]("user_db_connection_string")
user = User("Alice", 30)
user_db.insert(user)
users = user_db.select({"age": 30})

この例では、DatabaseConnectionクラスが任意の型Tのアイテムを扱えるようになっています。

typing.Genericの利点

  1. 型安全性: コンパイル時やIDEでの型チェックが可能になり、多くのバグを事前に防ぐことができます。

  2. コードの再利用性: 同じクラス構造を異なる型で再利用できます。

  3. 明確なインターフェース: クラスが扱うデータの型が明確になり、コードの理解が容易になります。

  4. ドキュメンテーション: コードそのものが型情報を含むドキュメントとなり、APIの使い方が分かりやすくなります。

注意点

  • Python 3.5以降でのみ使用可能です。
  • 実行時には型チェックは行われないため、動的型付け言語としてのPythonの特性は維持されます。

image.png

まとめ

image.png

typing.Genericを使用することで、汎用的で型安全なクラスを定義することができます。これにより、コードの品質と再利用性が向上し、大規模なプロジェクトでも保守性の高いコードを書くことができます。Pythonの型ヒントを積極的に活用し、より堅牢なソフトウェアを開発しましょう。

参考情報

より詳細な情報や高度な使用方法については、以下の公式ドキュメントを参照してください:

  1. Python公式ドキュメント - typing — Support for type hints

    • typingモジュール全般に関する詳細な情報が得られます。
  2. Python公式ドキュメント - Generic Types

    • Genericクラスの詳細な使用方法や、より複雑な型パラメータの使い方が説明されています。
  3. PEP 484 -- Type Hints

    • Pythonの型ヒントに関する提案書です。型ヒントの背景や設計思想について理解を深めることができます。
  4. mypy documentation - Generics

    • 静的型チェッカーmypyのドキュメントです。Genericの実践的な使用方法や型チェックの詳細について学べます。

これらの資料を参照することで、typing.GenericやPythonの型ヒントについてより深い理解を得ることができます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?