我有一个具体的类
MyConcreteClass
,它是一个抽象的子类
MyABC2
类,它又是另一个 abstract 类 MyABC1
: 的子类
import abc
class MyABC1 (object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def my_abstract_method (self):
raise NotImplementedError("MyABC1.my_abstract_method")
class MyABC2 (MyABC1):
__metaclass__ = abc.ABCMeta
class MyConcreteClass (MyABC2):
def my_abstract_method (self):
print "MyConcreteClass.my_abstract_method"
pylint
不喜欢我没有在my_abstract_method
中定义MyABC2
:
/usr/local/bin/epylint abctest.py
************* Module abctest
abctest.py:9: warning (W0223, abstract-method, MyABC2) Method 'my_abstract_method' is abstract in class 'MyABC1' but is not overridden
这是一个已知的错误吗? 也许我做错了什么?
Pylint 关于何时将类设计为抽象的概念有点有限。基本上,它无法表明您希望
MyABC2
类成为抽象类。它的逻辑假设,如果您不在类中声明任何用 @abstractmethod
(或引发 NotImplementedError
)修饰的方法,则您希望该类是具体的。在这种情况下,未能重写继承的抽象方法将是一个错误。
在
MyABC2
中声明元类没有帮助。事实上,该声明是完全多余的,因为子类从其父类继承其元类。
这就是错误警告的原因。现在的问题是该怎么办。理想情况下,pylint 会更复杂一些,可以更好地处理这种情况,但解决这个问题会很困难。我真的不知道它如何区分未添加任何新抽象方法的中级抽象类和错误实现的具体类之间的区别。
因此,唯一的选择可能是禁用该类的警告。尝试将以下注释添加到类声明上方的代码中:
# pylint: disable=W0223
。 (如果你把评论放在课堂上也可能有效,我不确定。)