python:操纵类的__dict__

时间:2010-09-03 09:08:26

标签: python-3.x metaclass

(全部在ActivePython 3.1.2中)

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

  

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

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

修改

我在类定义中添加了属性。

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

传统的赋值不起作用,因为我添加了大量属性,其名称由某个规则决定(所以我不能只输出它们)。

换句话说,假设我希望class A具有A.a001A.a999的属性;并且所有这些都必须在它完全构建之前定义(因为否则SQLAlchemy将无法正确地对其进行检测)。

另请注意,我在原始标题中输了一个拼写错误:它是我要修改的常规类{而不是元类的__dict__

3 个答案:

答案 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

希望这有帮助。