5

我正在做动态类生成,可以在“编译”时静态确定。我现在拥有的简单案例或多或少是这样的:

class Base(object):
    def __init__(self, **kwargs):
        self.do_something()

def ClassFactory(*args):
    some_pre_processing()
    class GenericChild(Base):
        def __init__(self, **kwargs):
            self.some_processing()
            super(GenericChild, self).__init__(*args, **kwargs)
    return GenericChild

Child1 = ClassFactory(1, 'Child_setting_value1')
Child2 = ClassFactory(2, 'Child_setting_value2')
Child3 = ClassFactory(3, 'Child_setting_value3')

在导入时,Python 解释器似乎编译为字节码,然后在每个 Python 实例中执行一次文件(从而生成Child1Child2和)。Child3

有没有办法告诉 Python 编译文件,执行一次以解包Child类,然后将其编译到pyc文件中,以便解包只发生一次(即使在 Python 脚本的连续执行中)?

我还有其他更复杂和更广泛的用例,所以简单地通过手写Child类来摆脱工厂并不是一个真正的选择。另外,如果可能的话,我想避免额外的预处理器步骤(比如在 C 预处理器中使用 C 风格的宏)。

4

2 回答 2

1

不,您必须生成 Python 代码,而不是将这些类“烘焙”到 Python 代码。

使用某种形式的字符串模板来生成 Python 源代码,将它们保存到.py文件中,然后对它们进行字节编译。

但是,类生成仅在启动时发生一次。产生这些真的有那么大的成本吗?

于 2013-03-05T22:21:24.037 回答
0

如果没有真正需要将子类分开,并且您只想为这些特定的对象集提供“标准配置”,则可以将 ObjectFactory 设置为存储在其中的配置的类。每个实例都能够使用适当的配置生成 GenericChildren,完全绕过类的运行时生成(以及与之相关的调试难题)。

于 2013-03-05T22:59:26.520 回答