从 Python 3.11 开始,您可以使用新的typing.Self object。对于较旧的 Python 版本,您可以使用以下命令获取相同的对象typing-extensions project:
try:
from typing import Self
except ImportError:
from typing_extensions import Self
class TrivialClass:
# ...
@classmethod
def from_int(cls, int_arg: int) -> Self:
# ...
return cls(...)
注意不需要注释cls
在这种情况下。
警告:mypy 支持Self
类型尚未发布;您需要等待0.991之后的下一个版本。 Pyright 已经支持它了。
如果您等不及 Mypy 支持,那么您可以使用泛型表明您将返回一个实例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(...)
任何重写类方法但返回 a 实例的子类父类 (TrivialClass
或者仍然是祖先的子类)将被检测为错误,因为工厂方法被定义为返回类型的实例cls
.
The bound
参数指定T
必须是(的子类)TrivialClass
;因为当您定义泛型时该类还不存在,因此您需要使用forward参考(带有名称的字符串)。
See the 注释实例和类方法 sectionPEP 484。
注意:此答案的第一次修订提倡使用前向引用
将类本身命名为返回值,但是第1212期使得使用泛型成为可能,这是一个更好的解决方案。
从 Python 3.7 开始,您can当您启动模块时,避免在注释中使用前向引用from __future__ import annotations,但是创建一个TypeVar()
模块级别的对象不是注释。即使在 Python 3.10 中也是如此,它推迟了注释中的所有类型提示解析。