1

我目前正在为 python 2 开发,我正在尝试使用抽象基类来模拟接口。我有一个接口、该接口的基本实现以及许多扩展基本实现的子类。它看起来像这样:

class Interface(object):
    __metaclass__ = ABCMeta

class IAudit(Interface):
    @abstractproperty
    def timestamp(self):
        raise NotImplementedError()

    @abstractproperty
    def audit_type(self):
        raise NotImplementedError()

class BaseAudit(IAudit):
    def __init__(self, audit_type):
        # init logic
        pass

    @property
    def timestamp(self):
        return self._timestamp

    @property
    def audit_type(self):
        return self._audit_type

class ConcreteAudit(BaseAudit):
    def __init__(self, audit_type):
        # init logic
        super(ConcreteAudit, self).__init__(audit_type)
        pass

但是 PyCharm 通知我ConcreteAudit应该实现所有抽象方法。但是,BaseAudit(未指定为 abc)已经实现了这些方法,并且ConcreteAuditBaseAudit. 为什么 PyCharm 会警告我?它不应该检测到IAudit的合同已经通过 执行了BaseAudit吗?

4

1 回答 1

2

为什么 PyCharm 会警告您?

因为所有的 Python IDE 都很糟糕,这就是原因。

每当实习生/初级程序员/同行告诉我我写的东西对他不起作用时,我告诉他我不会讨论它,直到他通过从命令行或股票解释器执行 Python 脚本来尝试它. 99% 的时间,问题消失了。

为什么他们很烂?打败我。但是它们有时都隐藏了异常,有时可以导入您不知道的东西,并且有时都决定(如在这种情况下)在股票解释器上运行的真实程序根本不会有问题有问题。

我在 Python 2.7 和 Python 3.4 中都试过你的代码,只要我from abc import ABCMeta, abstractproperty在顶部添加,它运行得很好。

因此,只需放弃 PyCharm,或更新标签以显示错误所在。

于 2015-09-29T02:54:59.660 回答