3

通过“计算”名称定义类属性时,如下所示:

class C(object):
    for name in (....):
        exec("%s = ..." % (name,...))

是否有与使用 exec 不同的方式来处理众多属性定义?getattr(C, name) 不起作用,因为在类构造期间未定义 C...

4

4 回答 4

11

怎么样:

class C(object):
    blah blah

for name in (...):
    setattr(C, name, "....")

即在定义后进行属性设置。

于 2009-05-26T20:03:41.027 回答
3
class C (object):
    pass

c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
于 2009-05-26T21:13:02.930 回答
2

如果您的整个班级都是“计算的”,那么我可以建议type可调用的。如果您的原始容器是 dict,这将特别有用:

d = dict(('member-%d' % k, k*100) for k in range(10))
C = type('C', (), d)

这会给你相同的结果

class C(object):
    member-0 = 0
    member-1 = 100
    ...

如果您的需求非常复杂,请考虑元类。(其实type 就是一个元类=)

于 2009-05-27T06:28:22.083 回答
0

为此目的使用元类怎么样?

查看问题 100003:什么是 Python 中的元类?.

于 2009-05-26T20:59:58.293 回答