在定义类时在python中设置具有给定名称的类属性

时间:2010-03-25 22:14:34

标签: python class setattr

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

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

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

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

4 个答案:

答案 0 :(得分:13)

你可以做得更简单:

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

与之前的答案相反,此解决方案适用于外部元类(例如,Django模型)。

答案 1 :(得分:11)

您需要为此使用元类:

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

答案 2 :(得分:8)

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

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

class A(object):
    pass

setattr(A, property, value)

否则,that thing Ignacio just said about metaclasses

答案 3 :(得分:0)

所以我知道这真的很老,可能会打败一匹死马,但当时我可能无法做到这一点,但我试图解决自己的问题。

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

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