サブクラス化を介して名前を付けたコンストラクターの引数を変更しますか?

StackOverflow https://stackoverflow.com/questions/3474118

質問

作成したい namedtuple これは、短いビットフィールドの個々のフラグを表しています。タプルが作成される前にビットフィールドを開梱できるように、サブクラス化しようとしています。しかし、私の現在の試みは機能していません:

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
    __slots__ = ()

    def __new__(cls, status):
        super(cls).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)

今、私の経験 super() 限られていて、私の経験です __new__ 事実上存在しないので、(私にとって)謎めいたエラーをどうするかはよくわかりません TypeError: super.__new__(Status): Status is not a subtype of super. 。グーグルとドキュメントを掘り下げることは、啓発的なものをもたらしていません。

ヘルプ?

役に立ちましたか?

解決

あなたはほとんどそれを持っていました:-)わずか2つの小さな修正があります:

  1. 新着 メソッドが必要です 戻る 声明
  2. 素晴らしい 呼び出しには2つの引数が必要です。 CLS状態

結果のコードは次のようになります:

import collections

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
    __slots__ = ()

    def __new__(cls, status):
        return super(cls, Status).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)

あなたが予想していたように、それはきれいに動作します:

>>> print Status(47)
Status(started=1, checking=2, start_after_check=4, checked=8, error=0, paused=32, queued=0, loaded=0)

他のヒント

私は避けます super 複数の相続財産に明示的にケータリングしていない限り(ここではそうではないことを願っています;-)。ようなことをするだけです...:

def __new__(cls, status):
    return cls.__bases__[0].__new__(cls,
                                    status & 1, status & 2, status & 4,
                                    status & 8, status & 16, status & 32,
                                    status & 64, status & 128)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top