【问题标题】:Class attributes with a "calculated" name具有“计算”名称的类属性
【发布时间】:2010-10-29 02:01:49
【问题描述】:

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

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

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

【问题讨论】:

  • 顺便说一句:您的“编译时”标签与 Python 问题不符。编译在这里并不是一个重要的考虑因素。这是关于定义一个类,而不是代码编译,这是一个正交问题。
  • @Ned:你是对的。我使用了“compile-time”标签,因为示例中的代码只在编译时执行。从技术上讲,它可以延迟执行,并且仍然需要定义类。

标签: python exec class-attributes


【解决方案1】:

怎么样:

class C(object):
    blah blah

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

即定义后做属性设置。

【讨论】:

    【解决方案2】:
    class C (object):
        pass
    
    c = C()
    c.__dict__['foo'] = 42
    c.foo # returns 42
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这会导致无法使用普通 Python 语法访问的属性名称,因为标识符不能包含连字符减号。在本例中使用_ 会更好。
      【解决方案4】:

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

      查看Question 100003 : What is a metaclass in Python?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2022-10-02
        • 2011-04-12
        • 2021-07-07
        • 1970-01-01
        • 2019-04-20
        • 2018-04-01
        相关资源
        最近更新 更多