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

17 投票
6 回答
12198 浏览
提问于 2025-04-15 19:18

我在尝试从一个字典生成一个类:

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

但是在循环的时候出现了一个错误,说attr没有定义。我知道我可以这样写:

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

不过我记得我在某个地方见过类似第一个例子的代码。有没有人知道是否可以写出类似第一个形式的代码?

6 个回答

4

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个工具或库的时候,遇到错误或者不明白怎么用。这个时候,查看别人遇到的类似问题和解决方案就很重要了。

在StackOverflow上,很多人会分享他们的经验和解决办法。你可以看到他们提问的方式,描述问题的细节,以及他们是如何一步步找到解决方案的。这些信息对我们学习编程非常有帮助,因为它们能让我们更好地理解问题的本质,以及如何避免类似的错误。

总之,遇到问题时,不要害怕去寻找帮助,看看别人是怎么解决的,这样你会学到很多东西。

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()
8

假设你想动态地添加一些类属性,比如这些

classDict = {}
for i in range(2):
    classDict["func%s"%(i+1)] = lambda self:"X"

你可以通过几种方式来实现,比如在类创建后再添加属性,因为在类内部你不容易直接访问类名

class Attr2(object):
    pass

for n,v in classDict.iteritems():
    setattr(Attr2, n, v)

print Attr2().func1(), Attr2().func2()

或者更好的方法是直接动态创建类,比如这样

Attr3 = type("Attr3",(), classDict)
print Attr3().func1(), Attr3().func2()

或者如果你愿意的话,可以使用 metaclass,比如

class AttrMeta(type):
    def __new__(cls, name, bases, dct):
        dct.update(classDict)
        return type.__new__(cls, name, bases, dct)

class Attr4(object):
    __metaclass__ = AttrMeta

print Attr4().func1(), Attr4().func2()
10

虽然这个方法看起来不是特别优雅,但你可以使用 locals() 这个函数:

>>> class c(object):
...     for i in range(10):
...         locals()['A' + str(i)] = i
... 
>>> c.A0
0
>>> c.A7
7

撰写回答