use*_*096 6 python inheritance type-hinting python-3.5 mypy
所以我的问题是,当我有一个做事的类型A的类并且我将那些函数用作子类(B)时,它们仍为类A键入,并且不接受我的类B对象作为参数或函数签名。
我的问题简化了:
from typing import TypeVar, Generic, Callable
T = TypeVar('T')
class Signal(Generic[T]):
def connect(self, connector: Callable[[T], None]) -> None:
pass
def emit(self, payload: T):
pass
class A:
def __init__(self) -> None:
self.signal = Signal[A]()
def do(self) -> None:
self.signal.emit(self)
def handle_b(b: "B") -> None:
print(b.something)
class B(A):
def __init__(self) -> None:
super().__init__()
self.signal.connect(handle_b)
@property
def something(self) -> int:
return 42
Run Code Online (Sandbox Code Playgroud)
我也可以提供完整的信号类别,但这只是分散了问题的注意力。这使我在mypy中出现一个错误->错误:“信号”的“连接”参数1具有不兼容的类型Callable [[B],无];预期可调用[[A],无]
由于信号处理是在A中实现的,因此子类B不能期望返回B类型的对象,即使它显然应该很好...
类型提示错误是完全正确的。您使用以下方法创建了一个Signal实例A作为类型:__init__A
self.signal = Signal[A]()
Run Code Online (Sandbox Code Playgroud)
传入子类很好,但与该Signal实例交互的所有代码现在都必须仅适用于A实例。handle_b()另一方面需要 的实例B,并且不能降低要求A。
删除约束:
self.signal = Signal()
Run Code Online (Sandbox Code Playgroud)
或者在每个子类中创建一个具有正确类型的实例。
| 归档时间: |
|
| 查看次数: |
1365 次 |
| 最近记录: |