Python中如何标注@classmethod构造方法的返回类型?
Python中类内类型注解引用未定义类的解决方案
在类定义过程中,User名称还未完全绑定到类对象,直接在方法返回注解里写-> User会触发NameError。对应C语言的前向声明需求,Python有以下几种实用方案:
方案1:字符串字面量标注
这是Python类型注解最初就支持的写法,把类名用字符串包裹。类型检查器会在类定义完成后解析这个字符串,避免提前引用未定义的名称。
修改后的代码:
#!/usr/bin/env python import pickle class User: @classmethod def from_bytes(cls, b: bytes) -> "User": obj = pickle.loads(b) assert type(obj) == cls, (type(obj), cls) return obj
方案2:使用typing.Self(Python 3.11+)
Python 3.11新增了Self类型,专门用来指代当前类,写法更直观。如果是Python 3.10及以下版本,需要先安装typing-extensions包后导入使用。
代码示例:
#!/usr/bin/env python import pickle from typing import Self class User: @classmethod def from_bytes(cls, b: bytes) -> Self: obj = pickle.loads(b) assert type(obj) == cls, (type(obj), cls) return obj
方案3:使用TypeVar兼容旧版本
对于Python 3.10及更早版本,可以用TypeVar定义一个绑定到目标类的类型变量,实现类似前向声明的效果。
代码示例:
#!/usr/bin/env python import pickle from typing import TypeVar # 提前定义类型变量,绑定到User类 UserType = TypeVar("UserType", bound="User") class User: @classmethod def from_bytes(cls, b: bytes) -> UserType: obj = pickle.loads(b) assert type(obj) == cls, (type(obj), cls) return obj
内容的提问来源于stack exchange,提问作者Vorac
相关产品推荐
相关产品推荐

