2

SimpleHTTPRequestHandler 클래스에 매개 변수를 전달해야하므로 클래스 팩토리를 사용하여 아래와 같이 사용자 지정 처리기를 만들었습니다.SimpleHTPRequestHandler에 매개 변수 전달

def RequestHandlerClass(application_path):  

    class CustomHandler(SimpleHTTPRequestHandler): 

    def __init__(self, request, client_address, server): 

     SimpleHTTPRequestHandler.__init__(self, request, client_address, server) 
     self._file_1_done = False 
     self._file_2_done = False 
     self._application_path = application_path 

    def _reset_flags(self): 

     self._file_1_done = False 
     self._file_2_done = False 

    def do_GET(self): 

     if (self.path == '/file1.qml'): 
      self._file_1_done = True 

     if (self.path == '/file2.qml'): 
      self._file_2_done = True 

     filepath = self._application_path + '/' + self.path # Error here 

     try: 
      f = open(filepath) 
      self.send_response(200) 
      self.end_headers() 
      self.wfile.write(f.read()) 
      f.close() 
     except IOError as e : 
      self.send_error(404,'File Not Found: %s' % self.path)  


     if (self._file_1_done and self._file_2_done): 
      self._reset_flags() 
      self.server.app_download_complete_event.set() 
    return CustomHandler 

이 사용자 정의 핸들러

class PythonHtpServer(BaseHTTPServer.HTTPServer, threading.Thread): 

    def __init__(self, port, serve_path): 
    custom_request_handler_class = RequestHandlerClass(serve_path) 
    BaseHTTPServer.HTTPServer.__init__(self, ('0.0.0.0', port), custom_request_handler_class) 
    threading.Thread.__init__(self) 
    self.app_download_complete_event = threading.Event() 

    def run(self): 
    self.serve_forever() 

    def stop(self): 
    self.shutdown()  

를 사용하여 내 HttpServer에 내가

http_server = PythonHtpServer(port = 8123, serve_path = '/application/main.qml') 

서버를 시작으로 서버를 시작,하지만 난이 오류를 얻을

AttributeError: CustomHandler instance has no attribute '_application_path' 

기본적으로 오류에서 서버 시작했는데 왜 속성을 만들지 않는지 (또는 init이 호출되지 않음) 모르겠다. 내가 어디로 잘못 가고 있는지 말해줘. 어떤 도움이라도 환영받을 것입니다. (이 예에서, application_path ~ = var)이 같은

답변

0

개념적으로, 당신이 작성한 것을 : 그래서 클래스가 MyClass의 인스턴스가을 만들 때 변수 var을 저장 기록

def createClass(var): 
    class MyClass: 
     def __init__(self): 
      self.var = var 
     def func(self): 
      # use var in some way 
      print (self.var) 
    # Return class definition 
    return MyClass 

. 그러나 함수가 완료 시간에 의해, 변수는을 파괴하고, 클래스는 클래스 정의 아닌 클래스 예를를 반환하기 때문에, MyClass의 인스턴스는 시간이 원래 변수에 의해 생성되지 않습니다 var 따라서 변수 var은 실제로는 MyClass에 의해 저장되지 않습니다.

대신, 당신은 너무처럼 MyClass.__init__ 함수에 인수로 var을 추가하고 MyClass 인스턴스의 생성을 처리하는 발전기 클래스를 만들 수 있습니다

class MyClass: 
    def __init__(self, arg1, arg2, var): 
     (self.arg1, self.arg2, self.var) = (arg1, arg2, var) 
    # Insert other methods as usual 

class MyClassGenerator: 
    def __init__(self, var): 
     self.var = var 
    def make(self, arg1, arg2): 
     return MyClass(arg1, arg2, var) 
2

을 가장 간단한 방법은 _application_path 정적을 만드는 것입니다 IMHO 클래스의 속성. 그것은 단지 클래스 선언시에 선언하고, 클래스의 인스턴스에 의해 투명하게 사용할 수 있습니다

def RequestHandlerClass(application_path):  

    class CustomHandler(SimpleHTTPRequestHandler): 

    _application_path = application_path # static attribute 

    def __init__(self, request, client_address, server): 

     SimpleHTTPRequestHandler.__init__(self, request, client_address, server) 
     self._file_1_done = False 
     self._file_2_done = False 

    def _reset_flags(self): 
     ... 

사용자 정의 핸들러 클래스의 모든 새로운 인스턴스가 self._application_path 같은 응용 프로그램 경로에 액세스 할 수 있습니다 그런 식으로.