21

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。グーグルでドキュメントを掘り下げても、啓蒙的なものは何も得られていません。

ヘルプ?

4

2 に答える 2

20

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

  1. 新しいメソッドにはreturnステートメントが必要です
  2. スーパーコールには、 clsStatusの2つの引数が必要です。

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

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)
于 2011-11-30T07:23:50.420 に答える
10

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)
于 2010-08-13T05:31:31.973 に答える