从该类的实例生成类的Python代码

4 投票
3 回答
1496 浏览
提问于 2025-04-17 03:51

在我的代码中,我在运行时生成新的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

也许你可以使用 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
2

你可以根据自己的具体需求,使用 compile()exec() 或者 eval() 这些函数。

3

从类对象本身生成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标准库有时也会用它来处理动态类,有时候。)

撰写回答