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

Python中如何定义带类型提示的基类使其包含自身实例属性

Python类内部使用自身类作为类型提示的解决方案

在类定义过程中,类对象还未完全创建完成,此时直接引用类名作为类型提示,会触发"名称未定义"的错误。以下是三种可行的解决方案:

1. 使用字符串字面量标注类型(兼容所有Python版本)

将类名用字符串包裹,类型检查器(如mypy)能够识别该字符串对应的类,而Python解释器不会在类定义阶段解析这个字符串,从而避免报错。

class Person():
    first_name: str = None
    last_name: str = None
    parent: 'Person' = None  # 用字符串包裹类名

    def __init__(self, first_name: str = None, last_name: str = None, parent: 'Person' = None):
        self.first_name = first_name
        self.last_name = last_name
        self.parent = parent

2. 导入__future__的annotations(Python 3.7+)

从__future__导入annotations后,所有类型提示会被保留为字符串形式,直到运行时才进行解析,这样就不会在类定义阶段因引用未完全创建的类而报错。

from __future__ import annotations

class Person():
    first_name: str = None
    last_name: str = None
    parent: Person = None

    def __init__(self, first_name: str = None, last_name: str = None, parent: Person = None):
        self.first_name = first_name
        self.last_name = last_name
        self.parent = parent

3. 使用typing.Self(Python 3.11+)

Python 3.11新增了typing.Self类型,专门用来指代当前类的实例,语义更清晰,无需直接引用类名。

from typing import Self

class Person():
    first_name: str = None
    last_name: str = None
    parent: Self = None

    def __init__(self, first_name: str = None, last_name: str = None, parent: Self = None):
        self.first_name = first_name
        self.last_name = last_name
        self.parent = parent

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:09