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

发布于 2024-07-20 22:28:42 字数 211 浏览 13 评论 0原文

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

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

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

When defining class attributes through "calculated" names, as in:

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

is there a different way of handling the numerous attribute definitions than by using an exec? getattr(C, name) does not work because C is not defined, during class construction...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

苏别ゝ 2024-07-27 22:28:42

怎么样:

class C(object):
    blah blah

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

即定义后进行属性设置。

How about:

class C(object):
    blah blah

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

That is, do the attribute setting after the definition.

说好的呢 2024-07-27 22:28:42
class C (object):
    pass

c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
class C (object):
    pass

c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
守护在此方 2024-07-27 22:28:42

如果你的整个类都是“计算的”,那么我可以建议使用 type 可调用的。 如果您的原始容器是一个字典,这尤其有用:

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一个元类=)

If your entire class is "calculated", then may I suggest the type callable. This is especially useful if your original container was a dict:

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

This would give you the same results as

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

If your needs are really complex, consider metaclasses. (In fact, type is a metaclass =)

撧情箌佬 2024-07-27 22:28:42

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

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

What about using metaclasses for this purpose?

Check out Question 100003 : What is a metaclass in Python?.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文