2013-11-21 2 views
0

eval을 사용하여 클래스 데이터 속성을 만들 수 있는지 궁금합니다. 다음과 같은 코드 : iPython에서Python 클래스 데이터 속성을 정의하는 데 eval 사용

class Test: 
    def __init(self): 
     matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P'] 
     for matrix in matrix_names: 
      print matrix 
      operation = "self.%s = self.__matrix_read(%s)" %\ 
      (matrix, matrix) 
      eval(operation) 

    def __matrix_read(self, filename): 
     return (read(".matrix/%s.csv"%filename)) 

내가 얻을 :

File "<string>", line 1 
    self.F = self.__matrix_read(F) 
    ^
SyntaxError: invalid syntax 
+1

왜이 작업을 수행 하시겠습니까?! – rlms

+0

은'eval' 대신'exec'을 사용합니다. 'eval'은 단지 표현식이나 문장이없는 것을 평가하는 것입니다. – User

답변

3

이에 대한 하지 사용 평가를 수행합니다. 런타임에 속성을 정의하려면 다른 방법이 있습니다.

인스턴스화시 속성을 정의하고 작성하려면 @PasteBT's answer에서 권장하는대로 setattr()을 사용하십시오.

응답을 동적으로 확장 할 수 있도록하려면 __getattr__() (좋은 대답은 동작의 명확성을 here으로 지정)을 사용하십시오.

예를 들어

:

class Test: 
    def __init__(self): 
     self.matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P'] 

    def __matrix_read(self, name): 
     return (read(".matrix/%s.csv"%filename)) 

    def __getattr__(self, name): 
     if name in self.matrix_names: 
      return self.__matrix_read(name) 

또는 다른 방법으로 (이럴 청소기,하지만 YMMV) :

class Test: 
    # note that this is only called if the attr does not exist 
    def __getattr__(self, name): 
     try: 
      with open(".matrix/{0}.csv".format(name)) as f: 
       return f.read() 
     except IOError: 
      raise AttributeError("{0} does not exist".format(name)) 

(파이썬 3 FileNotFoundErrorIOError 교체). 이 방법을 사용하면 응용 프로그램에 따라 바람직하지 않을 수도있는 미리 만들어진 파일 목록에 바인딩되지 않습니다.

7

당신은 기능 구축 않은 setattr 사용할 수 있습니다

class Test: 
    def __init(self): 
     matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P'] 
     for matrix in matrix_names: 
      print matrix 
      setattr(self, matrix, self.__matrix_read(matrix)) 
관련 문제