2014-01-20 55 views
4

我试图将__dict__成员添加到由namedtuple生成的类。 (__dict__存在于蟒2.7.3,但在2.7.5中除去。参见http://bugs.python.org/issue15535它是目前和蟒3.3记载。)我的代码使用VARS(nametuple_object),它是基于__dict__。我想在需要时修补课程。在Python中动态添加类__dict__属性

这是我曾尝试:

# Applies to Python 2.7.5 + 

C = namedtuple('C', ['x', 'y']) 
if not hasattr(C, '__dict__'): 
    C.__dict__ = property(C._asdict) 

这不起作用,因为C继承了__dict__,所以hasattr永远是真实的(强制时)财产转让收益:

Traceback (most recent call last): 
    File "namedtuple_dict.py", line 8, in <module> 
    C.__dict__ = property(C._asdict) 
AttributeError: attribute '__dict__' of 'type' objects is not writable 

也许,有没有办法引用未继承的C成员?


SOLUTION

下面是用从namedtuple类只是继承RDB的建议,而不是试图修改我的namedtuple包装:

def namedtuple_with_dict(typename, field_names, **kwargs): 

    C = CBase = namedtuple(typename, field_names, **kwargs) 
    if 0x02070500 <= sys.hexversion < 0x03000000: 
    C = type(typename, (CBase,), {'__dict__': property(CBase._asdict)}) 
    return C 
+0

从'vars'切换到'_fields'的选项? – user2357112

+0

我有一个非常相似的用例,但我的解决方案是将'__dict__'调用更改为'dict(zip(c._fields,c))',其中c是您的namedtuple实例。 – mtrovo

回答

6

namedtuple套__slots__到一个空的元组,这是专门为了避免为了内存优化而创建一个__dict__。这意味着它没有,也没有__dict__的设计。当__slots__存在时,您不能指定__dict__,或为此定义任何新字段。

这并不适用于派生类,虽然如此,你可以这样做:

CBase = namedtuple('C', ['x', 'y']) 

class C(CBase): 
    __dict__ = property(CBase._asdict) 

print C(1, 2).__dict__