在Python中动态添加类__dict__属性

时间:2014-01-20 23:37:14

标签: python namedtuple

我正在尝试将__dict__成员添加到由namedtuple生成的类中。 (__dict__出现在python 2.7.3中,但在2.7.5中已被删除。请参阅http://bugs.python.org/issue15535。它存在并记录在python 3.3中。)我的代码使用vars(nametuple_object),它基于在__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始终为true,并且(强制时)属性赋值返回:

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成员?


这是我的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

1 个答案:

答案 0 :(得分:6)

namedtuple将__slots__设置为空元组,这是为了避免为了内存优化而创建__dict__。这意味着它的设计没有也不能有__dict__。当__slots__存在时,您无法分配__dict__或定义任何新字段。

这不适用于派生类,所以你可以这样做:

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

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

print C(1, 2).__dict__