我正在尝试将一个变量赋值给一个类的实例,使该变量属于同一类型。我希望在构造变量时使用实例本身。为了兼容继承,我希望将其类型提示为类Self
而不是类。
以下作品:
class Foo:
var: "Foo"
def bar(self) -> None:
self.var = self
但是,var
被标记为 类型,Foo
而不是Self
。我想要的是:
from typing import Self
class Foo:
var: Self
def bar(self) -> None:
self.var = self
在这种情况下,mypy 向我显示以下消息:
error: Incompatible types in assignment (expression has type "Foo", variable has type "Self") [assignment]
显然,self
不被视为类型Self
,而仅被视为类型Foo
。
PEP 673(参考https://peps.python.org/pep-0673/)在 Python 3.11 中引入
typing.Self
,允许您编写:因此,在子类中,
clone()
它会被识别为返回子类类型。但目前,mypy 仅Self
在方法签名中支持特殊情况,而不在类级别的属性注释中支持。因此,当您编写:mypy 仍然将
Self
invar: Self
视为“当前类”(即Foo
),并且当你将 in 赋值给它认为是 (未知的后期绑定类型)的对象self
时, mypy 会报错。这本质上是 mypy 在处理后期绑定属性注释时的一个 bug/限制。Foo
Self
pep 中有使用 TypeVar 的示例。我建议结合泛型来创建一个变通方案。
例如:
或者,如果您想要“快速修复”,只需使用类名注释 var,就像您在 OP 中所做的那样。