【发布时间】:2010-12-31 05:14:56
【问题描述】:
据我了解,Python (2.5.2) 并没有真正支持抽象类。为什么 pylint 抱怨这个类是“抽象类而不是引用”?它会对抛出NotImplementedError 的任何类执行此操作吗?
我将每个类都放在自己的文件中,所以如果是这种情况,我想我别无选择,只能隐藏此消息,但我希望可能有另一种解决方法。
"""Package Repository interface."""
class PackageRepository(object):
"""Package Repository interface."""
def __init__(self):
self.hello = "world"
def get_package(self, package_id):
"""
Get a package by ID.
"""
raise NotImplementedError( \
"get_package() method has not been implemented")
def get_packages(self):
"""
Get all packages.
"""
raise NotImplementedError( \
"get_packages() method has not been implemented")
def commit(self):
"""
Commit all changes.
"""
raise NotImplementedError( \
"commit() method has not been implemented")
def do_something(self):
"""
Doing something.
"""
return self.hello
编辑
也许我应该澄清一下。我意识到这是一个抽象类,我很想使用 abstract 关键字,但据我了解,这在 Python 中都不重要(至少在我目前使用的版本中),所以我没有费心做任何有趣的抽象技巧(就像那些 found here) 一样,只是把它排除在外。
我很惊讶地看到 pylint 意识到这是一个抽象类。是什么让 pylint 确定这是一个抽象类?它只是在寻找NotImplementedError 被扔到某个地方吗?
【问题讨论】:
-
是什么让你说它不是抽象的?它肯定不能按原样使用。它为每个方法函数抛出异常。如果这不是一个例子,你所说的“抽象”是什么意思?
-
@Beau Simensen:你为什么专注于每个文件一个类。这是非常非 Pythonic 的。确实,这是您问题的根本原因。没有人(尤其不是 pylint)期望每个文件一个类。你为什么这样做?请更新您的问题,解释您为什么这样做。
-
FWIW,提高 NotImplementedError 足以让 pylint 认为这是一个抽象类(这是绝对正确的)。来自logilab.org/card/pylintfeatures: W0223: 方法 %r 在类 %r 中是抽象的,但未被覆盖在具体类中未覆盖抽象方法(即 raise NotImplementedError)时使用。
-
Tobiesque 有正确的答案......现在只要他把它作为答案发布:P
-
就 Pylint 文档而言,Tobiesque 有正确的答案,但是一个具有引发 NotImplemented 抽象类的方法的类以什么奇怪的方式出现?您仍然可以实例化该类(这就是为什么您将
raise NotImplementedError而不仅仅是pass作为方法主体的原因),因此将任何此类称为“抽象”似乎是一个可怕的延伸。这根本没有意义,尤其是现在(在 2.6+ 中)Python 实际上确实支持abstract base classes。