Python未实现方法与抽象方法,哪种更符合Python风格?PyCharm不喜欢基类中未实现的方法
我遇到了一个和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
,取决于什么样的行为是合理的默认选择。如果你希望用户自己提供这个方法,就应该抛出异常。