在Python中使用for循环添加类属性

2024-05-17 02:54:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从字典中生成一个类:

class attr:
    for key in objects_type:
        setattr(attr, key, lambda cl: list())

这会导致在for循环期间未定义attr的错误。我知道我可以写:

class attr:
    pass
for key in objects_type:
    setattr(attr, key, lambda cl: list())

但我肯定我记得在某个地方看到过类似于第一个示例的代码。有人知道是否可以写出类似于第一种形式的东西吗?


Tags: lambdakeyinfor字典objectscltype
3条回答

我不知道你在做什么。我可以给您一个在for循环中向类添加类属性的示例:

attributes = ('x', 5), ('y', 6), ('name', 'Cls')

class Cls:
  pass
for key, value in attributes:
  setattr(Cls, key, value)

记住,for必须在定义整个类之后运行。您会得到一个错误,即attr没有定义,因为您想在创建类之前访问它(class ...是python中的一个语句,它创建了一个类对象)。创建类和rememeber后必须添加属性,这些属性将是类属性,而不是实例属性。

虽然不是很优雅,但是可以使用locals()

>>> class c(object):
...     for i in range(10):
...         locals()['A' + str(i)] = i
... 
>>> c.A0
0
>>> c.A7
7
newmeths = {
  'two': lambda self: 2,
}

class MC(type):
  def __init__(cls, name, bases, dict):
    for k, v in newmeths.iteritems():
      setattr(cls, k, v)
    super(MC, cls).__init__(name, bases, dict)

class C(object):
  __metaclass__ = MC
  pass

c=C()
print c.two()

相关问题 更多 >