代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

具有“计算”名称的类属性

  •  3
  • Eric O. Lebigot  · 技术社区  · 15 年前

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

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

    与使用exec相比,是否有不同的方法来处理大量属性定义?getattr(c,name)不起作用,因为在类构造期间没有定义c…

    4 回复  |  直到 15 年前
        1
  •  11
  •   Ned Batchelder    15 年前

    怎么样:

    class C(object):
        blah blah
    
    for name in (...):
        setattr(C, name, "....")
    

    也就是说,在定义之后进行属性设置。

        2
  •  3
  •   Dan    15 年前
    class C (object):
        pass
    
    c = C()
    c.__dict__['foo'] = 42
    c.foo # returns 42
    
        3
  •  2
  •   Antti Rasinen    15 年前

    如果你的整个班级都是“计算的”,那么我可以建议你 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
        ...
    

    如果您的需求真的很复杂,请考虑元类。(事实上, 类型 元类=)

        4
  •  0
  •   Community CDub    7 年前

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

    退房 Question 100003 : What is a metaclass in Python? .