我正在尝试做这样的事情:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
但我似乎无法找到对类的引用,以使setattr
与在类定义中分配变量一样工作。我怎么能这样做?
答案 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)
答案 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