对于抽象类,错误“未调用基类的__init__方法”

时间:2014-08-01 03:18:20

标签: python pylint

我有

class A(object):
    def __init__ (self): raise NotImplementedError("A")

class B(A):
    def __init__ (self):
        ....

和pylint说

__init__ method from base class 'A' is not called

显然,我不想做

super(B, self).__init__()
  • 那我该怎么办?

(我尝试了abc并获得了

Undefined variable 'abstractmethod'

来自pylint,所以这也不是一个选项。)

3 个答案:

答案 0 :(得分:6)

忽略pylint。它只是一个不考虑抽象类的程序。要相信你比它更聪明。 Pylint是一个护膝,而不是拐杖。

答案 1 :(得分:4)

使用abc对我有用:

import abc

class A(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        super(B, self).__init__()

我收到警告,但没有与abc或父母__init__未被调用相关的内容:

C:  1, 0: Missing module docstring (missing-docstring)
C:  3, 0: Invalid class name "A" (invalid-name)
C:  3, 0: Missing class docstring (missing-docstring)
R:  3, 0: Too few public methods (0/2) (too-few-public-methods)
C:  9, 0: Invalid class name "B" (invalid-name)
C:  9, 0: Missing class docstring (missing-docstring)
R:  9, 0: Too few public methods (0/2) (too-few-public-methods)
R:  3, 0: Abstract class is only referenced 1 times (abstract-class-little-used)

为了它的价值,我和@holdenweb在这一点上。有时你比pylint更了解。

答案 2 :(得分:1)

__init__定义为抽象方法不是很有用。

相反,使A继承自ABC AB 摘录 C lass),并在用于以下方法的方法上使用@abstractmethod装饰器确实需要由用户实施。

from abc import ABC, abstractmethod

class A(ABC):
    @abstractmethod
    def cool_method(self):
        raise NotImplemented

那样,您实际上将无法实例化A,并且同时避免了警告。还应考虑到__init__的默认A方法在未实现时可能类似于:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

因此,它具有遵守mro的优势,如果您以后想在多继承设置中使用A,就不会遇到问题。

相关问题