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

您几乎拥有它 :-) 只有两个小更正:

  1. 新方法需要一个return语句
  2. 超级调用应该有两个参数,clsStatus

生成的代码如下所示:

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 回答