如何用PEP695注解表达工厂与产品的自引用泛型关联?
解决PEP695泛型中Self在约束上下文无效的问题
问题原因
Pylance提示'Self is not valid in this context',是因为Self类型注解不能用于泛型参数的约束表达式里。PEP695当前实现中,Self仅支持在类内部的方法返回值、属性定义等场景使用,没法在泛型参数的bound约束里引用当前类的类型。
解决方案
用typing.TypeVar定义两个互相绑定的类型变量,通过bound参数实现工厂与产品的双向类型约束,替代原代码里Self的用法。
修改后的代码示例
factory.py
from typing import TypeVar from abc import ABC from __future__ import annotations # 开启后可避免前向引用的字符串写法 # 定义互相绑定的类型变量,实现双向约束 F = TypeVar("F", bound="AbstractFactory") G = TypeVar("G", bound="AbstractGood") class AbstractFactory[G: AbstractGood[F]](ABC): def __init__(self, good_class: type[G]) -> None: self.good_class = good_class def produce(self) -> G: good = self.good_class(self) return good class AbstractGood[F: AbstractFactory[G]](ABC): def __init__(self, factory: F): self.factory = factory
charlie.py
from factory import AbstractFactory, AbstractGood class ChocolateFactory(AbstractFactory[ChocolateBar]): ... class ChocolateBar(AbstractGood[ChocolateFactory]): ...
说明
- 定义的
F和G两个TypeVar,通过bound参数分别绑定到对方关联的抽象类,既让AbstractFactory明确生产的产品类型,也让AbstractGood明确关联的工厂类型,实现了双向类型约束。 - 如果没有开启
from __future__ import annotations,子类继承时需要用字符串字面量(比如AbstractFactory["ChocolateBar"])避免前向引用错误。
内容的提问来源于stack exchange,提问作者winwin
相关产品推荐
相关产品推荐

