如何在Python中创建带自引用类型提示的递归dataclass
Python dataclass 自引用类型标注解决方案
注意:原示例中
[Category]的写法不符合Python类型标注规范,列表类型标注统一使用list[元素类型](Python 3.9+)或typing.List[元素类型](Python 3.9及以下)的形式。
解法1:Python 3.7+ 启用延迟标注求值
- 在文件顶部导入
from __future__ import annotations,Python会延迟所有类型标注的解析时机,直到整个模块加载完成,类内部就可以直接引用自身。 - 代码示例:
from __future__ import annotations from dataclasses import dataclass @dataclass class Category: title: str children: list[Category] tree = Category(title='title 1', children=[ Category('title 11', children=[]), Category('title 12', children=[]) ])
解法2:字符串字面量标注(兼容所有Python 3版本)
- 把自引用的类名用引号包裹为字符串形式,类型检查工具会自动匹配到对应的类,不需要额外导入。
- 代码示例:
from dataclasses import dataclass from typing import List # Python 3.9+可省略该行,直接用list代替List @dataclass class Category: title: str children: List["Category"]
解法3:Python 3.11+ 使用typing.Self(最简洁)
- 3.11及以上版本可以直接使用
Self类型,自动指向当前定义的类,后续修改类名时不需要同步修改类型标注。 - 代码示例:
from dataclasses import dataclass from typing import Self @dataclass class Category: title: str children: list[Self]
内容的提问来源于stack exchange,提问作者RomanGodMode
相关产品推荐
相关产品推荐

