(全部在ActivePython 3.1.2中)
我试图改变类(而不是实例)属性。元类的__dict__
似乎是完美的解决方案。但是当我试图修改时,我得到了:
TypeError:'dict_proxy'对象 不支持项目分配
为什么,我能做些什么呢?
修改
我在类定义中添加了属性。
setattr
不起作用,因为该类尚未构建,因此我还不能参考它(或者至少我不知道如何)。
传统的赋值不起作用,因为我添加了大量属性,其名称由某个规则决定(所以我不能只输出它们)。
换句话说,假设我希望class A
具有A.a001
到A.a999
的属性;并且所有这些都必须在它完全构建之前定义(因为否则SQLAlchemy将无法正确地对其进行检测)。
另请注意,我在原始标题中输了一个拼写错误:它是我要修改的常规类{而不是元类的__dict__
。
答案 0 :(得分:3)
在某些规则之后创建大量属性会产生严重错误。我会回去看看是否有更好的方法。
在这里说过“邪恶的代码”(但我认为它会起作用)
class A:
locals()['alpha'] = 1
print A.alpha
这是有效的,因为在定义类时,有一个字典可以跟踪您定义的局部变量。这些局部变量最终成为类属性。小心本地人,因为它不一定“正确”。你真的不应该修改本地人,但是当我尝试它时它似乎确实有效。
答案 1 :(得分:1)
不是使用声明性语法,而是单独构建表,然后在其上使用mapper。请参阅http://www.sqlalchemy.org/docs/05/ormtutorial.html#我认为在定义计算属性时没有好的方法可以添加计算属性。
或者,我不知道这是否有效,但是:
class A(object):
pass
A.all_my_attributes = values
class B(declarative_base, A):
pass
可能会奏效。
答案 2 :(得分: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
希望这有帮助。