在定义类时在Python中设置类属性

18 投票
4 回答
21819 浏览
提问于 2025-04-15 20:51

我想做类似这样的事情:

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

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

但是我找不到这个类的引用,导致我无法让 setattr 像在类定义中直接给变量赋值那样工作。我该怎么做呢?

4 个回答

9

这可能是因为在你执行 setattr(A, p, v) 的时候,类 A 还没有完全初始化。

你可以先试试把 setattr 移到 class 代码块结束之后再执行,看看这样是否有效,比如:

class A(object):
    pass

setattr(A, property, value)

如果这样还是不行,可以看看 Ignacio 提到的关于 metaclasses 的内容

38

你可以更简单地做到这一点:

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

跟之前的回答相比,这个解决方案能很好地与外部元类配合使用(比如,Django模型)。

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

撰写回答