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

Cas*_*ash 11 python metaprogramming

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

class attr:
    for key in objects_type:
        setattr(attr, key, lambda cl: list())
Run Code Online (Sandbox Code Playgroud)

这给出了在for循环期间未定义attr的错误.我知道我可以写:

class attr:
    pass
for key in objects_type:
    setattr(attr, key, lambda cl: list())
Run Code Online (Sandbox Code Playgroud)

但我确信我记得在某处看到类似于第一个例子的代码.有谁知道是否有可能写出类似于第一种形式的东西?

Max*_*keh 9

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

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

  • 你不应该改变locals()dict:http://docs.python.org/library/functions.html#locals (6认同)

Anu*_*yal 8

假设您想动态添加类属性,例如这些

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

您可以通过多种方式执行此操作,例如只需在创建类后添加属性,因为您可以轻松访问类内的类名

class Attr2(object):
    pass

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

print Attr2().func1(), Attr2().func2()
Run Code Online (Sandbox Code Playgroud)

或者更好的是即时创建类,例如

Attr3 = type("Attr3",(), classDict)
print Attr3().func1(), Attr3().func2()
Run Code Online (Sandbox Code Playgroud)

或者如果您希望使用元类,例如

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()
Run Code Online (Sandbox Code Playgroud)