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

sds*_*sds 8 python pylint

我有

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

class B(A):
    def __init__ (self):
        ....
Run Code Online (Sandbox Code Playgroud)

和pylint说

__init__ method from base class 'A' is not called
Run Code Online (Sandbox Code Playgroud)

显然,我不想这样做

super(B, self).__init__()
Run Code Online (Sandbox Code Playgroud)
  • 那我该怎么办?

(我试过abc并得到了

Undefined variable 'abstractmethod'
Run Code Online (Sandbox Code Playgroud)

从pylint,所以这也不是一个选项).

hol*_*web 7

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

  • 感谢您的赞美,但我不希望在生产代码中看到任何警告或错误. (2认同)

dan*_*ano 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__()
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

就其价值而言,我支持@holdenweb。有时你比 pylint 更了解。

  • 从 pylint 的角度来看,这是最好的解决方案,但调用抽象方法很奇怪......抽象方法的设计目的是被覆盖,而不是被调用 (3认同)