Pylint W0223:Method ...在类中是抽象的......但是没有被覆盖

Ada*_*amC 10 python pylint

Pylint为抽象类的子类生成此错误,即使这些子类本身未实例化并且在具体子类重写了这些方法.为什么Pylint认为我的抽象子类是具体的?如何在没有敲出锤子并在rc文件中完全禁用它的情况下关闭此警告?

sth*_*ult 10

由于某种原因,pylint认为该类不是抽象的(当前检测是通过检查引发NotImplementedError的方法来完成的).#pylint: disable=W0223在模块顶部添加注释(仅用于在此模块中禁用)或类(仅在此类中),应该可以解决问题.

  • 好的,所以答案是pylint的检测机制存在缺陷,因为它不考虑元类.我知道我可以在模块级别禁用,但它似乎不是一个有用的检查当前形式. (3认同)

Mic*_*ski 5

为了关闭错误的abstract-method警告,您可以使用超类而不是使用元类来实现抽象类abc.ABCabc.ABCMeta

例如,此代码将引发警告:

from abc import ABCMeta, abstractmethod


class Parent:
    __metaclass__ = ABCMeta

    @abstractmethod
    def do_something(self):
        pass


class Child(Parent):
    __metaclass__ = ABCMeta

Run Code Online (Sandbox Code Playgroud)

但这不会:

from abc import ABC, abstractmethod


class Parent(ABC):

    @abstractmethod
    def do_something(self):
        pass


class Child(Parent, ABC):
    pass

Run Code Online (Sandbox Code Playgroud)

警告!使用 ABC 超类和多重继承,您必须注意潜在的方法解析顺序 (MRO) 问题。