![](/img/trans.png)
[英]Pylint error __init__ method from base class '*' is not called
[英]Error "__init__ method from base class is not called" for an abstract class
我有
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,所以這也不是一個選擇)。
忽略pylint。 它只是一個沒有考慮抽象類的程序。 相信你比它更聰明。 Pylint 是護膝,而不是拐杖。
使用abc
對我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 更清楚。
將空的__init__
定義為抽象方法不是很有用。
取而代之的是,使A
繼承ABC
(AB加強海峽Ç姑娘),並使用@abstractmethod
裝飾上,真正需要由用戶來實現的方法。
from abc import ABC, abstractmethod
class A(ABC):
@abstractmethod
def cool_method(self):
raise NotImplemented
這樣,您將實際上無法實例化A
,同時,您可以避免警告。 還要考慮到A
的默認__init__
方法在未實現時將類似於以下內容:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
因此,另外,它具有尊重mro
的優點,如果您以后想在多重繼承設置中使用A
,則不會遇到問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.