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)
但我确信我记得在某处看到类似于第一个例子的代码.有谁知道是否有可能写出类似于第一种形式的东西?
虽然它不是很优雅,但您可以使用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)
假设您想动态添加类属性,例如这些
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)