【问题标题】:python/mypy: how to declare ABC using value implemented both as property and attributepython/mypy:如何使用作为属性和属性实现的值来声明 ABC
【发布时间】:2021-11-08 23:16:19
【问题描述】:

我有一个抽象基类,它使用一个值,它在不同的具体类中的实现可以是属性或属性:

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"

但是,由于foo,我无法删除n: int,也无法放入抽象属性,因为这会破坏X。我应该如何声明基类以使 mypy 满意?

【问题讨论】:

标签: python properties mypy python-typing abc


【解决方案1】:

Y 的灵活性不能低于Base 并且是一个子类,因此您可能需要将n 设为Base 的抽象属性,然后将设置器添加到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

    ...

【讨论】:

  • 是的......嗯......这涉及数值计算,并最终想要 numba.jitclass X,但我意识到 numba 无论如何都不支持 ABC,至少目前.当/如果确实如此,我会让“n”完全成为一个只读属性......但你的回答对于我的要求是正确的!
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2020-02-09
相关资源
最近更新 更多