2011-10-07 3 views
2

내 코드에서는 런타임에 새로운 파이썬 클래스를 생성합니다. 그들 중 일부는 .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() 

희망을 구현하기 위해 노력하고있어.

감사

+0

당신이 간단한 예제를 줄 수 :

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)) 

수율을 그리고 당신이 달성하고자하는 것에 대한 설명? – NPE

+0

설명해 주셔서 감사합니다. 이제, "나는 동적으로 클래스 A를 만들었습니까?"라는 것이 정확히 무엇을 의미합니까? 그것은 당신의'.py' 파일의 일부가 아닌 것처럼 들리며, 코드를 문자열로 생성하고'eval' it로 ... 그렇게하는 것은 정확히 당신이하는 일입니다. – NPE

+0

다음은 내가 동적으로 클래스를 작성하기 위해 작성한 예제입니다. Foo = type ('Foo',(), { 'bar': True}) – mogo

답변

0

클래스 객체 자체에서 파이썬 코드를 생성하는 것은 사실상 불가능합니다. 다른 방법으로 클래스를 생성하기위한 지침을 저장해야합니다.


가장 좋은 방법은 함수가 클래스를 만들 필요하고, 생성 된 코드에서 호출 &을 가져올 수 있습니다. 이렇게 생성 된 코드는 다음과 같습니다

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

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

다른 옵션은 직접 원하는 파이썬 코드, exec는 클래스를 확인한 다음 수업으로 저장하기를 생성합니다.

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

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

항상 exec과 마찬가지로 매우 신중해야합니다. 모든 파이썬 코드를 실행할 수 있습니다. 다른 방법으로해야 할 일을 할 수있는 방법이 있다면 열심히 생각하십시오. 사람들은 exec을 사용하여 당신에게 외칠 것입니다. (그러나 심지어 파이썬 표준 라이브러리는 동적 클래스 sometimes을 위해 그것을 사용합니다.)

+0

네, 정말 힘들 것 같습니다. 나는 그것을 다른 방식으로 생성하려고 노력할 것이다. 고마워. – mogo

1

당신은 compile(), exec() 또는 eval() 당신의 정확한 필요에 따라 사용할 수 있습니다.

+0

답변을 주셔서 감사합니다. . – mogo

+0

괜찮습니다. 질문을 수정하여 명확하게 할 수 있습니다. –

0

아마도 당신은 inspect.getsource 사용할 수 있습니다 : 일부 코드,

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

감사합니다.하지만 불행히도 유형이 'A',() { 'bar': True} 인 클래스를 생성하면 inspect.getsource가 작동하지 않습니다. – mogo

관련 문제