我在python 3中有以下代码:
class Position:
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __add__(self, other: Position) -> Position:
return Position(self.x + other.x, self.y + other.y)
Run Code Online (Sandbox Code Playgroud)
但是我的编辑器(PyCharm)说无法解析引用位置(在_add__方法中).我该如何指定我希望返回类型是类型__add__?
编辑:我认为这实际上是一个PyCharm问题.它实际上使用其警告中的信息和代码完成

但如果我错了,请纠正我,并需要使用其他语法.
Python 的类型系统允许在类中使用泛型:
class A(Generic[T]):
def get_next(self) -> T
Run Code Online (Sandbox Code Playgroud)
这非常方便。然而,即使在 3.11 中使用 Self 类型,我也找不到T在不指定类名的情况下更改类型参数 (the ) 的方法。以下是 PEP 673 中的推荐用法: 自类型:https ://peps.python.org/pep-0673/a
class Container(Generic[T]):
def foo(
self: Container[T],
) -> Container[str]:
# maybe implementing something like:
return self.__class__([str(x) for x in self])
Run Code Online (Sandbox Code Playgroud)
问题是如果我想子类化容器:
class SuperContainer(Container[T]):
def time_travel(self): ...
Run Code Online (Sandbox Code Playgroud)
然后,如果我有一个 SuperContainer 的实例并在其上调用 foo ,则输入将会错误,并认为它是一个 Container 而不是 SuperContainer。
sc = SuperContainer([1, 2, 3])
sc2 = sc.foo()
reveal_type(sc2) # mypy: Container[str]
sc2.time_travel() # typing error: only SuperContainers can time-travel
isinstance(sc2, SuperContainer) …Run Code Online (Sandbox Code Playgroud)