我正在尝试做这样的事情:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
但我似乎无法找到对类的引用以使其setattr
与在类定义中分配变量一样工作。我怎样才能做到这一点?
你可以做的更简单:
class A():
vars()['key'] = 'value'
与之前的答案相比,此解决方案与外部元类(例如 Django 模型)配合得很好。
您需要为此使用元类:
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
这可能是因为A
当你在setattr(A, p, v)
那里做的时候类没有完全初始化。
首先要尝试的是在关闭class
块后将 settattr 向下移动并查看是否有效,例如
class A(object):
pass
setattr(A, property, value)
所以我知道这真的很老,可能会打败一匹死马,这在当时可能是不可能的,但我遇到了这个试图解决我自己的问题。
我意识到这可以在没有元分类的情况下完成。
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