从此类的python实例生成类的python代码

时间:2011-10-07 11:30:10

标签: python code-generation metaprogramming

在我的代码中,我在运行时生成新的python类。对于其中一些,我想生成python代码,就像我在.py文件中编写这些类一样。

假设我动态创建了一个A类: type('A', (), {'bar':True}等同于代码:

class A(object): 
    bar=True

我想要的是从我的动态类生成这个等效代码。 我正在尝试实现一个函数“generate_A_code”

kls_A = type('A', (), {'bar':True}
kls_A.generate_A_code()

希望这有点帮助。

由于

3 个答案:

答案 0 :(得分:1)

根据您的具体需要,您可以使用compile()exec()eval()

答案 1 :(得分:0)

从类对象本身生成Python代码实际上是不可能的。您需要以另一种方式保存生成课程的说明。


最好的方法可能是拥有制作课程的功能,以及导入&在生成的代码中调用它。所以生成的代码看起来像这样:

kwargs = {answer=42, name='foo'}

import class_maker
SomeClass1 = class_maker.make_class(**kwargs)

另一个选项是直接生成你想要的Python代码,exec生成类,然后用类保存它。

code = '''class MyClass:
    pass
'''

the_locals = {}
exec(code, globals(), the_locals)
MyClass = the_locals['MyClass']
MyClass._code = code

exec一样,请务必小心使用它。它可以运行任何Python代码。如果有任何方式以不同的方式做任何你需要做的事情,请认真思考。人们会因使用exec而大喊大叫。 (但即使Python标准库也将它用于动态类sometimes。)

答案 2 :(得分:0)

也许您可以使用inspect.getsource

import inspect

def generate_kls_A(num):
    class A(object):
        def __init__(self):
            self.init = num
    return A
kls_A=generate_kls_A(1)
print(inspect.getsource(kls_A))

的产率:

class A(object):
    def __init__(self):
        self.init = num