2016-05-26 9 views
2

を私はのpythonはTypeError:__new __()1つの必要な位置引数不足している: '名前空間'

tsf = TimeSeriesFeature(cut_avg, interval)

を使用してクラスを初期化しようとするが、私はTypeError例外を得た:__new __()不足している1つの必要な位置引数: '名前空間' を。

TimeSeriesFeatureの初期化コードは以下の通りです:

class TimeSeriesFeature(BasicFeature): 
    def __init__(self, cut_avg, interval): 
     super().__init__() 
     self.cut_avg = cut_avg 
     self.interval = interval 
     self.get_avg() 

とBasicFeatureのinitコード:

class BasicFeature(ABCMeta): 
    def __init__(self): 
     self.times = {} 
     self.avg = {} 

と私はpython3.5を使用しています。間違いはありますか?

+5

なぜあなたは 'ABCMeta'から継承していますか?それはメタクラスだ。 – bereal

答えて

3

あなたが取得しているエラーは、メタクラスのインスタンス化は、それが__init__方法だ使用していないという事実からであるが、むしろそれは3つの引数を期待する(自己を除く)__new__方法ですが、最後のビーイングは名前空間は語りました。それが今立って、あなたのクラスは(a metaclassある)ABCMetaから継承したよう

は、したがって、それはまた、メタクラスです:

class BasicFeature(ABCMeta): 
    ... 

が、私はあなたではなくあなたのクラスのメタクラスとしてABCMetaを設定すると思う:

class BasicFeature(metaclass=ABCMeta): 
    ... 

あなたのクラスは普通のクラスになります。ABCMetaはメタクラスです。

あなたはBasicFeatureこのように、それに抽象メソッドを追加し、(初期化することは不可能で、他の言葉で)抽象クラスになりたい場合は、次の

class BasicFeature(metaclass=ABCMeta): 

    @abstractmethod 
    def get_avg(): 
     pass 

をして@abstractmethodデコレータなしサブクラスでそれをオーバーロード:

class TimeSeriesFeature(BasicFeature): 

    def get_avg(): 
     # ... some code 
     # ... some code 

その後、BasicFeatureをインスタンス化しようとするユーザーは、抽象的であることget_avg()に関するエラーを取得しますが、インスタンス化ユーザーがTimeSeriesFeatureしません。 the documentation

+1

私は他人にBasicFeatureを初期化させたくないので、ABCMetaから継承します。それを防ぐための良い方法がありますか? – modkzs

+0

私はあなたのコメントに質問に対処するために私の答えを拡張しました。より広範なコードサンプルがなければ、どのメソッドが '@ abstractmethod'の良い候補になるのか分かりませんが、上記の例がはっきりしていることを願っています。 – mbdevpl

関連する問題