簡體   English   中英

抽象類的錯誤“未調用基類的 __init__ 方法”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM