16

我正在尝试做这样的事情:

property = 'name'
value = Thing()
class A:
  setattr(A, property, value)
  other_thing = 'normal attribute'

  def __init__(self, etc)
    #etc..........

但我似乎无法找到对类的引用以使其setattr与在类定义中分配变量一样工作。我怎样才能做到这一点?

4

4 回答 4

31

你可以做的更简单:

class A():
    vars()['key'] = 'value'

与之前的答案相比,此解决方案与外部元类(例如 Django 模型)配合得很好。

于 2013-12-16T10:04:12.277 回答
16

您需要为此使用元类:

property = 'foo'
value = 'bar'

class MC(type):
  def __init__(cls, name, bases, dict):
    setattr(cls, property, value)
    super(MC, cls).__init__(name, bases, dict)

class C(object):
  __metaclass__ = MC

print C.foo
于 2010-03-25T22:28:47.137 回答
9

这可能是因为A当你在setattr(A, p, v)那里做的时候类没有完全初始化。

首先要尝试的是在关闭class块后将 settattr 向下移动并查看是否有效,例如

class A(object):
    pass

setattr(A, property, value)

否则,Ignacio 刚才所说的关于元类的事情

于 2010-03-25T22:22:10.467 回答
1

所以我知道这真的很老,可能会打败一匹死马,这在当时可能是不可能的,但我遇到了这个试图解决我自己的问题。

我意识到这可以在没有元分类的情况下完成。

setattr 接受和对象、访问器名称和值。那么对象不是类名而是类的具体实例,可以用self来完成。

class A(object):
    def __init__(self):
        self.a = 'i am a accessor'
        setattr(self, 'key', 'value')

a = A()
print a.a
print a.key
于 2016-04-19T14:21:17.250 回答