通过子类化修改namedtuple的构造函数参数?

时间:2010-08-13 05:22:48

标签: python new-operator super namedtuple

我想创建一个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__的体验几乎不存在,所以我不太清楚该怎么做(对我而言)神秘错误{{ 1}}。谷歌搜索和挖掘文档并没有产生什么启发。

帮助?

2 个答案:

答案 0 :(得分:17)

你差不多了:-)只有两点小修正:

  1. new 方法需要 return 语句
  2. super 调用应该有两个参数, cls 状态
  3. 结果代码如下所示:

    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)
    

答案 1 :(得分: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)