为什么pylint一直说我的班级是R0923 - '界面未实现'

时间:2014-01-02 08:49:37

标签: python interface pylint

我正在用abc模块编写python类来定义抽象类并使用子类来实现抽象方法。但是,当我试图使用pylint来证明它时,pylint一直说我的子类是“接口未实现”。我有点困惑pylint如何看待一个类是一个接口。谁能对我有所了解?

这是我的示例代码。当我致电pylint mytest.py时,结果为R0923: 17:MyClass: Interface not implemented

import abc


class MyInterface(object):
    """docstring for MyInterface"""

    __metaclass__ = abc.ABCMeta

    def __init__(self, arg):
        self.arg = arg

    @abc.abstractmethod
    def test(self):
        pass


class MyClass(MyInterface):
    """docstring for MyClass"""
    def __init__(self, arg):
        super(MyClass, self).__init__(arg)

    def test(self):
        """docstring for test"""
        print self.arg

2 个答案:

答案 0 :(得分:5)

Pylint对接口以及如何使用它们持主观态度。在你的情况下,你从pylint的角度混合了两个不同的概念。一个是抽象类,另一个是接口。 Pylint认为处理抽象类的正确方法是从它继承而正确使用接口的方法是在类实现中通过将它列在__implements__类变量中来指定它,如下所示:

class Dog(object):
    __implements__ = (IWalk, IRun, IMakeASound)

在这里查看你的具体案例是pylint的思路如下:

  • 推断MyInterface是其名称的接口。
  • 同样MyInterface是一个抽象类,因为所有的abc内容正在进行中。
  • MyClassMyInterface抽象类的实现。
  • MyClass继承自MyInterface界面。

到目前为止,根据pylint的观点,一切顺利。 MyInterface抽象类已被子类化,MyInterface接口已被子类化,因此它可能只是其他接口的基类。

  • 得出结论:MyClass是一个接口,因为它继承自MyInterface接口。
  • MyClass接口尚未在任何地方实施。

从pylint的角度来看,这是出了问题。

为了为pylint制作一个连贯的故事,您可以像这样调整代码:

import abc


class MyInterface(object):
    """docstring for MyInterface"""

    __metaclass__ = abc.ABCMeta

    def __init__(self, arg):
        self.arg = arg

    @abc.abstractmethod
    def test(self):
        pass


class MyClass(MyInterface):
    """docstring for MyClass"""
    def __init__(self, arg):
        super(MyClass, self).__init__(arg)

    def test(self):
        """docstring for test"""
        print self.arg

class MyImplementation(object):
    __implements__ = (MyClass, )

答案 1 :(得分:1)

__implements__声明是一个过时的Zope约定,并且检查程序已从最近版本的pylint中删除。