2012-02-20 6 views
0

여기에 코드가 있습니다. _getTestObj()에서 데모 인스턴스를 만들 때 exec에 의해 정의 된 'demo'클래스가 작동하지 않습니다.python exec 정의 클래스가 작동하지 않습니다.

파일 이름 : test.py

class runOneIni(): 
    def _getTestObj(self): 
     demo(self.tcName,secSetup,doc) 



def start(): 
    #implicit define 'demo' class by exec is not working, get error in runOneIni->_getTestObj, Error is : 
    # NameError: name 'demo' is not defined 
    a='global demo' 
    exec(a) 

    str="class demo(tInvokeMethod.tInvokeMethod): pass' 
    exec(str) 

    #Explict define demo class is working 
    #global demo 
    #class demo(tInvokeMethod.tInvokeMethod): pass 


if __name__ == '__main__': 
    start()  

답변

1

(1) 당신이 종결되지 않은 문자열

(2)이 작업을 수행 할 exec를 사용하는 것이 필요하다. class은 그 자체로 실행 문입니다. 다른 명령문은 어디에서나 사용할 수 있습니다 (표현식 문이 필요한 곳 ​​제외).

0

문제는 exec를 통해 클래스를 정의하는 것과 관련이 없습니다. 로 다음 작품 구성 :

exec 'class hi: pass' 

귀하의 문제는 간부 문 안쪽 "세계가"그것 밖에 아무 효과가 없다는 것입니다. exec에 대한 파이썬 문서에 따르면 :

global은 파서의 지시어입니다. 전역 구문과 동시에 구문 분석 된 코드에만 적용됩니다. 특히 exec 문에 포함 된 전역 문은 exec 문이 포함 된 코드 블록에는 영향을 미치지 않으며 exec 문에 포함 된 코드는 exec 문이 포함 된 코드의 전역 문에 영향을받지 않습니다.

0

왜 그런가요?(임원 구별)
exec으로 그 이유는 무엇입니까?

또한, exec 함께 할 일 :

  1. 이 작동하지 않습니다.
  2. 다른 결과는 python-2.xpython-3.x입니다.

예 :의이 exec 함께 해보자 지금

a 
b 
b 

을 그리고 :

class demo: 
    a = 'a' 

print(demo.a) 

def start(): 
    exec('global demo', globals(), locals()) 

    exec('class demo: b = "b"', globals(), locals()) 

    try: 
     print(demo.a) 
    except AttributeError: 
     print(demo.b) 

if __name__ == '__main__': 
    start() 

    try: 
     print(demo.a) 
    except AttributeError: 
     print(demo.b) 

출력 0,123,339

class demo: 
    a = 'a' 

print(demo.a) 

def start(): 
    global demo 
    class demo: b = "b" 

    try: 
     print(demo.a) 
    except AttributeError: 
     print(demo.b) 

if __name__ == '__main__': 
    start() 

    try: 
     print(demo.a) 
    except AttributeError: 
     print(demo.b) 

python-2.xpython-3.x에 하나가 줄 것이다:

a 
b 
a 

출력 python3.2 :

a 
a 
a 

Q : 어떻게 '동적으로 클래스를 생성'하기?

친절한 이미 말씀 드리면, exec은 그렇게 할 수 없습니다.

또는 class factory 그래도 실제로 필요한가요?

+0

내가하고 싶은 것은 동적 생성 클래스입니다.이 예제에서는 'demo'라는 클래스이지만 클래스 이름은 고정되어 있지 않습니다. 가변적입니다. 그래서 제 생각은 문자열을 사용하여 클래스 문을 생성하고, exec 문자열을 생성하는 것입니다. – brike

+0

글쎄, 그럼, 동적으로 클래스를 만들면,'exec'가 거의 필요 없다! – kindall

+0

'동적으로 클래스를 생성하는 방법'? – brike

0

은 당신이 뭔가를 할 수 있습니다 :

class SomeBaseClass(object): 
    def __init__(self): 
     self.a = 1 
     self.b = 2 

def make_new_class(name): 
    class TemplateClass(SomeBaseClass): 
     def __init__(self): 
      SomeBaseClass.__init__(self) 
      self.a = 3 
    return type(name, (TemplateClass,), {}) 

o1 = SomeBaseClass() 
print o1.a, o1.b 

NewClass = make_new_class('NewClass') 
o2 = NewClass() 
print o2.a, o2.b 

결과 :

1 2 
3 2 
0

나는 파티에 늦게 조금 수 있습니다하지만 난 괜찮 작동하는 것 같다 뭔가를 내놓았다. 설정 속성 때문에 형식을 수정합니다.

나는이 모든 것이 엄청나게 만족스럽지 않다고 확신하지만 나는 다소 재미 있다고 생각한다.

def generateClass(propertyNames,propertyTypes): 


    string = 'class generatedClass(object):\n def __init__(self):\n' 

    for pN in propertyNames: 
     string += '  self._m' + pN + ' = None\n' 


    string += ' \n \n' 

    i = 0 
    for pN in propertyNames: 
     string += ' @property\n' \ 
      ' def ' + pN + '(self):\n' \ 
      '  return self._m' + pN + '\n' \ 
      ' @' + pN + '.setter' +'\n' \ 
      ' def ' + pN + '(self,a'+ pN + '):\n' \ 
      '  if a' + pN + ':\n'\ 
      '   self._m'+ pN + ' = ' + propertyTypes[i] + '(a' + pN + ')\n'\ 
      '  \n' 
     i += 1 

    exec(string) 
    return generatedClass() 

if __name__ == '__main__': 
    c = generateClass(['SomePropertyName'],['str']) 
    print c.__dict__ 
    setattr(c,'SomePropertyName','some string') 
    print c.__dict__ 
관련 문제