You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为抽象类方法添加父类任意子类实例的类型提示?

抽象类方法返回任意子类实例的类型提示方案

你遇到的问题是因为typing.Self会将返回类型约束为子类自身,而你需要的是返回抽象类的任意子类实例。正确的做法是将抽象类方法的返回类型直接声明为抽象类本身,而非Self。

修改后的代码示例

from __future__ import annotations
from abc import ABC, abstractmethod
from typing import override
import random

class DiceResult(ABC):
    @abstractmethod
    def reroll(self) -> DiceResult:
        pass

class NaturalTwenty(DiceResult):
    @override
    def reroll(self) -> DiceResult:
        return random.choice([NaturalTwenty(), NaturalOne()])

class NaturalOne(DiceResult):
    @override
    def reroll(self) -> DiceResult:
        return random.choice([NaturalTwenty(), NaturalOne()])

原理说明

  • Self类型的作用是约束方法返回调用者的具体类型,因此子类继承后,Self会被解析为子类自身,此时返回其他子类实例就会触发类型检查错误。
  • 将抽象类方法的返回类型设为抽象类本身后,所有子类都是该抽象类的子类型,返回任意子类实例都符合类型协变规则,类型检查器会认可这种返回值。

兼容旧Python版本的写法

如果使用Python 3.9及以下版本,需要用引号包裹抽象类名避免前向引用:

from abc import ABC, abstractmethod
from typing import override
import random

class DiceResult(ABC):
    @abstractmethod
    def reroll(self) -> "DiceResult":
        pass

# 子类代码同上

内容的提问来源于stack exchange,提问作者502E532E

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:40:23