2

我有一个具体类MyConcreteClass,它继承了一个抽象MyABC2,而抽象类又继承了另一个抽象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

这是一个已知的错误?也许我做错了什么?

4

1 回答 1

3

Pylint 关于何时打算将类抽象化的概念有点有限。基本上,它不能说您打算将该MyABC2类作为抽象类。它的逻辑假设如果您不在类中声明任何用@abstractmethod(或 raise NotImplementedError)修饰的方法,那么您希望该类是具体的。在这种情况下,未能覆盖继承的抽象方法将是一个错误。

声明元类MyABC2没有帮助。事实上,该声明是完全多余的,因为子类从其父类继承其元类。

所以这就是错误警告的原因。现在的问题是如何处理它。理想情况下,pylint 会更复杂一些,并且可以更好地处理这种情况,但解决这个问题会很困难。我真的不知道它如何区分不添加任何新抽象方法的中级抽象类和错误实现的具体类之间的区别。

所以可能唯一的选择是禁用该类的警告。尝试在类声明上方的代码中添加以下注释:# pylint: disable=W0223. (如果您将评论放在课堂上,它也可能会起作用,我不确定。)

于 2016-08-31T22:27:15.780 回答