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
相关产品推荐
相关产品推荐

