Python未实现方法与抽象方法,哪种更符合Python风格?PyCharm不喜欢基类中未实现的方法

6 投票
1 回答
6208 浏览
提问于 2025-04-18 00:41

我遇到了一个和PyCharm(社区版3.1.1)有关的具体问题。下面这个简单的例子可以说明我的情况。为了方便,我会用PyCharm的截图,而不是直接输入代码,原因很快就会明白。

如你所见,调用self.say_hello()的地方在PyCharm中被高亮显示为黄色,这大概是因为say_hello()Base类中没有实现。我故意不在基类中实现say_hello(),因为我想要一种“抽象”的效果,这样Base的实例就不能调用say_hello()(所以也不应该调用hello()),而Child的实例可以调用hello()(这个在Base类中实现)。我该如何实现这种“抽象”的效果,而不让PyCharm发出警告呢?

我从这里了解到,我可以使用abc模块。但对我来说,这样做有点麻烦,而且不太符合Python的风格。你有什么建议吗?

1 个回答

12

我会把 say_hello() 实现成一个占位符:

class Base(object):
    # ...as above...

    def say_hello(self):
        raise NotImplementedError

另外,你也可以在 say_hello() 的内容里只写 pass

这样做也能告诉使用你 Base 类的人,say_hello() 这个方法需要被实现,否则当她调用 obj.hello() 时就会遇到一个属性错误(AttributeError)。

到底是抛出一个异常(Exception)还是用 pass,取决于什么样的行为是合理的默认选择。如果你希望用户自己提供这个方法,就应该抛出异常。

撰写回答