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
を使うことで、サブクラスに対応した汎用的な型指定が可能になります。