在Python中动态添加类dict属性

在Python中动态添加类dict属性,python,namedtuple,Python,Namedtuple,我正在尝试向namedtuple生成的类添加一个\uuuu dict\uuuu成员。(\uuuu dict\uuu出现在python 2.7.3中,但在2.7.5中被删除。请参阅。它出现并记录在python 3.3中。)我的代码使用vars(nametuple\u对象),它基于\uu dict\uu。我想在需要的时候给班级打补丁 以下是我尝试过的: # Applies to Python 2.7.5 + C = namedtuple('C', ['x', 'y']) if not hasatt

我正在尝试向namedtuple生成的类添加一个
\uuuu dict\uuuu
成员。(
\uuuu dict\uuu
出现在python 2.7.3中,但在2.7.5中被删除。请参阅。它出现并记录在python 3.3中。)我的代码使用vars(nametuple\u对象),它基于
\uu dict\uu
。我想在需要的时候给班级打补丁

以下是我尝试过的:

# Applies to Python 2.7.5 +

C = namedtuple('C', ['x', 'y'])
if not hasattr(C, '__dict__'):
  C.__dict__ = property(C._asdict)
这不起作用,因为C继承了一个
\uuuu dict\uuuu
,所以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
回溯(最近一次呼叫最后一次):
文件“namedtuple_dict.py”,第8行,在
C.。uuu dict_uuu=属性(C.u asdict)
AttributeError:“type”对象的属性“\uuuu dict\uuuuuu”不可写
也许,有没有一种方法可以引用未继承的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
def namedtuple_与dict(typename,field_name,**kwargs):
C=CBase=namedtuple(类型名、字段名、**kwargs)

如果0x02070500namedtuple将uuu slots设置为空元组,这是为了避免为了内存优化而创建uu dict。这意味着它没有也不可能通过它的设计来决定。当存在时隙时,不能分配时隙,也不能为此定义任何新字段

但这不适用于派生类,因此您可以执行以下操作:

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

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

print C(1, 2).__dict__

vars
切换到
\u fields
是一个选项吗?我有一个非常类似的用例,但我的解决方案是将
\u dict\u
调用更改为
dict(zip(c.\u fields,c))
,其中c是您的namedtuple实例。