python - python/mypy:如何使用作为属性和属性实现的值来声明 ABC
问题描述
我有一个抽象基类,它使用一个值,其在不同具体类中的实现可以是属性或属性:
from abc import ABC, abstractmethod
class Base(ABC):
n: int
def foo(self):
...
a = ... + self.n
@abstractmethod
def bar(self):
...
class X(Base):
def __init__(self, n: int):
self.n = n
def bar(self):
...
class Y(Base):
@property
def n(self) -> int:
...
def bar(self):
...
上面的代码(大纲,适当填写)在运行时工作,但 mypy 抱怨以下属性Y
:
error: Signature of "n" incompatible with supertype "Base"
但是,我不能删除n: int
因为foo
,我也不能放入一个抽象属性,因为这会破坏X
。我应该如何声明基类以使 mypy 满意?
解决方案
Y
不能比它更灵活,Base
并且是一个子类,因此您可能需要创建n
一个抽象属性,Base
然后将一个 setter 添加到X
. 它不漂亮,但它有效(我想,我没有检查过)
class X(Base):
def __init__(self, n: int):
self._n = n
@property
def n(self) -> int:
return self._n
@n.setter
def n(self, n: int) -> None:
self._n = n
...
推荐阅读
- sql - sql:如何处理数字类型的案例?
- excel - 如何在 Excel 的选择案例中嵌入创建下拉列表?
- mongodb - 如何将mongodb解码结构传递给函数
- javascript - 我正在尝试部署 Heroku,但出现此错误 - code = H10, desc = app crashed method=GET path="/" status=503
- python - 如何从现有组件图中获取具有给定边数的随机组件子图?
- typeorm - 使用 createQueryBuilder 将十进制字段转换为字符串
- azure - Azure CLI 查询帮助 - JMESPath - 使用有空格的键进行过滤,提取其中有空格的键(来自 Powershell)
- python - For Loop - Range - Python - 关于增量逻辑的问题
- c# - 非静态字段需要使用 FluentValidation 返回对象验证类
- r - R中的for循环问题