0

(全部在 ActivePython 3.1.2 中)

我试图更改类(而不是实例)属性。元__dict__类的 似乎是完美的解决方案。但是当我尝试修改时,我得到了:

TypeError:“dict_proxy”对象不支持项目分配

为什么,我能做些什么呢?

编辑

我在类定义中添加属性。

setattr不起作用,因为该类尚未构建,因此我还不能引用它(或者至少我不知道如何)。

传统分配不起作用,因为我要添加大量属性,其名称由特定规则确定(因此我不能只输入它们)。

换句话说,假设我class AA.a001通过A.a999; 并且必须在完全构建之前定义所有这些(因为否则 SQLAlchemy 将无法正确检测它)。

另请注意,我在原标题__dict__中打错了字:我想修改的是普通类,而不是元类。

4

3 回答 3

3

遵循某些规则创建大量属性听起来像是严重错误。我会回去看看是否有更好的方法来做到这一点。

话虽如此,这里有“邪恶代码”(但我认为它会起作用)

class A:
    locals()['alpha'] = 1

print A.alpha

这是有效的,因为在定义类时,有一个字典可以跟踪您定义的局部变量。这些局部变量最终成为类属性。小心当地人,因为它不一定会“正确”行事。你真的不应该修改本地人,但当我尝试它时它似乎确实有效。

于 2010-09-03T17:24:41.563 回答
1

不要使用声明性语法,而是单独构建表,然后在其上使用映射器。请参阅http://www.sqlalchemy.org/docs/05/ormtutorial.html#我认为在定义类时没有很好的方法将计算属性添加到类中。

或者,我不知道这是否可行,但是:

class A(object):
    pass
A.all_my_attributes = values

class B(declarative_base, A):
   pass 

可能会起作用。

于 2010-09-04T13:38:28.927 回答
0

我不太熟悉 3 如何处理dict但您可以通过简单地继承字典类来规避这个问题,如下所示:

class A(dict):
 def __init__(self,dict_of_args):
  self['key'] = 'myvalue'
  self.update(dict_of_args)
  # whatever else you need to do goes here...

A() 可以这样引用:

d = {1:2,3:4}
obj = A(mydict)
print obj['test'],obj[3]  # this will print myvalue and 4

希望这可以帮助。

于 2010-09-03T17:54:03.750 回答