【问题标题】:Generate python code of a class from an python instance of this class从这个类的python实例生成一个类的python代码
【发布时间】:2011-12-02 22:49:30
【问题描述】:

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

希望这会有所帮助。

谢谢

【问题讨论】:

  • 您能否举一个简单的例子,并附上一些代码并解释您想要实现的目标?
  • 感谢您的澄清。现在,“我动态创建了一个 A 类”究竟是什么意思?听起来它不是您的.py 文件的一部分,您也不会将代码生成为字符串和eval 它......那么您到底在做什么?
  • 这是我写的动态创建类的示例:Foo = type('Foo', (), {'bar':True})

标签: python code-generation metaprogramming


【解决方案1】:

从类对象本身生成 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】:

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

【讨论】:

  • 感谢您的回答,但我认为我的帖子并不清楚。
【解决方案3】:

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

【讨论】:

  • 谢谢,但不幸的是,如果您使用 type('A', () {'bar':True}) 生成类,inspect.getsource 将不起作用
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 2021-09-13
  • 2015-06-10
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多