在元类机制之前动态创建类字段

2 投票
6 回答
843 浏览
提问于 2025-04-16 02:25

我正在尝试去掉代码中的 exec,代码大概是这样的:

class A(object):
    for field in ['one', 'two', 'three']:
        exec '%s = "%s value"' % (field, field)

...所以我希望能变成这样:

>>> A.one
'one value'
>>> A.two
'two value'
>>> A.three
'three value'

编辑:另外,标题中提到的要求也要满足,也就是说 A.oneA 被创建之前就得是 'one value'(不要和 A() 创建混淆)。

有没有什么办法可以做到呢?

6 个回答

2

我会直接从元类继承,然后在那里面处理。

class MyMetaClass(MetaClass):
    def __new__(meta, classname, baseclasses, classdict):
        fields = classdict['__myfields__']
        for field in fields:
            classdict[field] = field + ' value'
        del classDict['__myfields__']
        MetaClass.__new__(meta, classname, baseclasses, classdict)

这样你就可以直接这样做:

class A(object):
    __metaclass__ = MyMetaClass
    __myfields__ = ['one', 'two', 'three']
2

使用 这个 setattr 函数

class A(object):
  pass

for field in ['one', 'two', 'three']:
  setattr(A, field, field + ' value')
2

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,但其实很多时候,解决办法并不复杂。

比如说,当你在写代码的时候,可能会发现某个功能没有按照预期工作。这时候,首先要做的就是仔细检查你的代码,看看有没有拼写错误或者逻辑上的问题。

另外,很多时候我们可以通过查阅文档或者在网上搜索相关问题来找到解决方案。社区里有很多人也遇到过类似的问题,他们的经验可能会对你有帮助。

总之,遇到问题时不要慌张,保持冷静,逐步排查,通常都能找到解决办法。

>>> values = 'one', 'two', 'three'
>>> A = type('A', (object,), {i: i + ' value' for i in values})
>>> A.one
'one value'
>>> A.three
'three value'

撰写回答