2011-10-07 23 views
2

在我的代碼中,我在運行時生成了新的python類。對於其中的一些,我想生成python代碼,就像我將這些類寫入.py文件一樣。從這個類的python實例生成一個類的python代碼

比方說,我動態創建A類: type('A',(), {'bar':True}這相當於代碼:

class A(object): 
    bar=True 

我要的是生成從我的動態類,這相當於代碼。 我想實現一個函數「generate_A_code」

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

希望這有助於一點。

感謝

+0

你能舉一個簡單的例子,有一些代碼並解釋你想要達到的目標? – NPE

+0

謝謝澄清。現在,「我動態創建A類」是什麼意思?這聽起來像它不是你的'.py'文件的一部分,你也不會像字符串和'eval'那樣生成代碼......那麼你究竟做了什麼? – NPE

+0

下面是我寫的一個動態創建類的例子:Foo = type('Foo',(),{'bar':True}) – mogo

回答

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

+0

是的,它似乎很難。我會嘗試以另一種方式生成它。謝謝。 – mogo

1

您可以使用根據您的具體需求compile()exec()eval()

+0

感謝您的回答,但我認爲我的帖子並不清晰。 – mogo

+0

這很好。你可以編輯你的問題來澄清。 –

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 
+0

感謝但不幸的是,如果您使用type('A',(){'bar':True})生成類,inspect.getsource不起作用。 – mogo

相關問題