Pythonの型ヒントを使用する際、クラス内のメソッドで自身のクラスを参照したい場合があります。Python 3.11以降では、Self型を利用することで簡単に指定できますが、古いバージョンでは文字列を使って前方参照を行う方法が一般的です。

Python 3.11でのSelfの使用

Python 3.11からはSelf型が導入され、クラス自身を型ヒントに指定するための簡単な方法が提供されています。

from typing import Self
class Position:
    def __add__(self, other: Self) -> Self:
        return type(self)(self.x + other.x, self.y + other.y)

このように、Selfを使うことで、他のクラスや自身のクラスを返す際の型ヒントを明確にできます。

古いPythonバージョンでの型ヒント指定方法

Python 3.11以前では、クラスの名前を文字列で指定して型ヒントを行います。この方法は、クラスが定義される前に型ヒントが使用される場合でも利用できます。

class Position:
    def __add__(self, other: 'Position') -> 'Position':
        return Position(self.x + other.x, self.y + other.y)

また、from __future__ import annotationsを使えば、型ヒントの評価を遅延させ、クラス名をそのまま使うことも可能です。

from __future__ import annotations
class Position:
    def __add__(self, other: Position) -> Position:
        return Position(self.x + other.x, self.y + other.y)

TypeVarを使用する方法

TypeVarを使って、クラスの継承構造に対応した型ヒントを提供することも可能です。

from typing import TypeVar
T = TypeVar('T', bound='Position')
class Position:
    def __add__(self: T, other: T) -> T:
        return type(self)(self.x + other.x, self.y + other.y)

この方法は、クラス自身を返すメソッドがあり、サブクラスで適切な型が返されるようにしたい場合に便利です。

まとめ

Python 3.11以降では、Self型が導入され、クラス内で自身を参照する型ヒントを指定するのが容易になりました。古いバージョンでは、文字列やfrom __future__ import annotationsを使って型を前方参照することで対応できます。さらに、TypeVarを使うことで、サブクラスに対応した汎用的な型指定が可能になります。