子类使用父类@property.setter时Mypy严格模式报错的解决咨询
解决Mypy对父类property setter装饰器的类型检查错误
问题场景
当子类继承自带有@property装饰器的父类,尝试通过@父类.属性.setter语法在子类中定义属性的setter方法时,使用mypy --strict模式会触发两个类型检查错误:
示例代码
from abc import ABC class Cell(ABC): def __init__(self, value: int | None = None): self._value = value @property def value(self) -> int | None: return self._value class InputCell(Cell): @Cell.value.setter def value(self, value: int) -> None: self._value = value
Mypy错误输出
react.py:28: error: "Callable[[Cell], int | None]" has no attribute "setter" [attr-defined] react.py:28: error: Untyped decorator makes function "value" untyped [misc]
解决方案
方案一:用cast标记装饰器类型
Mypy无法自动识别父类property的setter属性,我们可以通过typing.cast明确告诉Mypy该装饰器的正确类型:
from abc import ABC from typing import cast class Cell(ABC): def __init__(self, value: int | None = None): self._value = value @property def value(self) -> int | None: return self._value class InputCell(Cell): @cast(property, Cell.value).setter def value(self, value: int) -> None: self._value = value
方案二:父类中显式定义空setter(推荐)
如果可以修改父类代码,在父类中先定义一个空的setter方法(比如抛出NotImplementedError),让Mypy能正确识别property的setter属性,子类再重写该方法:
from abc import ABC class Cell(ABC): def __init__(self, value: int | None = None): self._value = value @property def value(self) -> int | None: return self._value @value.setter def value(self, value: int) -> None: raise NotImplementedError("子类必须实现该setter方法") class InputCell(Cell): @value.setter def value(self, value: int) -> None: self._value = value
这种方式更符合面向对象设计规范,同时彻底解决Mypy的类型检查问题。
方案三:临时忽略错误(不推荐)
如果无法修改代码结构,可以在错误行添加注释忽略Mypy检查,但这只是临时 workaround,不建议长期使用:
class InputCell(Cell): @Cell.value.setter # type: ignore[attr-defined, misc] def value(self, value: int) -> None: self._value = value
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

