ジェネリック型を使用して、次のインスタンスを返すことを示しますcls
。
from typing import Type, TypeVar
T = TypeVar('T', bound='TrivialClass')
class TrivialClass:
# ...
@classmethod
def from_int(cls: Type[T], int_arg: int) -> T:
# ...
return cls(...)
ファクトリ メソッドは の型のインスタンスを返すように定義されているため、クラス メソッドをオーバーライドしているが、親クラス(TrivialClass
またはまだ祖先であるサブクラス) のインスタンスを返すサブクラスは、エラーとして検出されますcls
。
bound
引数は、それが (のサブクラス) でなければならないことを指定しT
ますTrivialClass
。ジェネリックを定義するとき、クラスはまだ存在しないため、前方参照(名前付きの文字列) を使用する必要があります。
PEP 484 のインスタンスとクラスメソッドに注釈を付けるセクションを参照してください。
注:この回答の最初の改訂では、クラス自体を戻り値として指定する前方参照を使用することを提唱しましたが、問題 1212により、代わりにジェネリックを使用できるようになり、より良い解決策になりました。
Python 3.7 では、モジュールを で開始するときにアノテーションで前方参照を使用する必要がなくなりますが、モジュール レベルでオブジェクトをfrom __future__ import annotations
作成することはアノテーションではありません。TypeVar()
これは Python 3.10 でも当てはまり、アノテーションのすべての型ヒントの解決が延期されます。