首页 > 解决方案 > 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 满意?

标签: pythonpropertiesmypypython-typingabc

解决方案


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

    ...

推荐阅读