我正在用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
答案 0 :(得分:5)
Pylint对接口以及如何使用它们持主观态度。在你的情况下,你从pylint的角度混合了两个不同的概念。一个是抽象类,另一个是接口。 Pylint认为处理抽象类的正确方法是从它继承而正确使用接口的方法是在类实现中通过将它列在__implements__
类变量中来指定它,如下所示:
class Dog(object):
__implements__ = (IWalk, IRun, IMakeASound)
在这里查看你的具体案例是pylint的思路如下:
MyInterface
是其名称的接口。MyInterface
是一个抽象类,因为所有的abc内容正在进行中。MyClass
是MyInterface
抽象类的实现。 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中删除。