我有
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,所以这也不是一个选项。)
答案 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
,就不会遇到问题。