我想要做这样的事情:

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

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

但我似乎无法找到的参考类得到的 setattr 工作一样只是分配一个变量在类定义。我怎么可以这样做?

有帮助吗?

解决方案

您需要使用一元类为这样的:

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

其他提示

您可以做到这一点更简单:

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

在与先前的答案,将该溶液起着以及与外部元类(为前,Django模型)。

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

首先要尝试将仅仅是移动settattr下来以后,你靠近 class 块,看看这样的作品,例如

class A(object):
    pass

setattr(A、财产值)

否则, 这件事,伊格纳西奥刚刚说的有关元类.

所以我知道这是真的老了,也许白费口舌,连同这个试图解决我自己的问题,这可能是不可能的时间,但我的凸轮。

我意识到这一点可以在不metaclassing来完成。

在SETATTR需要和目的,访问名称和值。那么对象不是类的名字它的类,它可以具有自我实现的具体实例。

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

a = A()
print a.a
print a.key
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top