2014-09-22 79 views
3

我在python写了一个HTTP服务器程序,我RequestHandler类继承BaseHTTPServer,它初始化成员的,但在那里BaseHTTPServer是第一个初始化语句,当我改变了初始化语句中的顺序,这将是正确的,我不能访问它。我无法通过继承python中的BaseHTTPServer访问成员,为什么?

#!/usr/bin/env python 

import BaseHTTPServer 

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def __init__(self, request, client_address, server): 
     BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) 
     self.a = 0 
     print 'aaaa' 
    def do_GET(self): 
     print self.a # will cause exception 
     self.send_response(200) 
     self.send_header('Content-Type', 'text/plain') 
     self.end_headers() 

server_address = ('127.0.0.1', 8080) 
server_class = BaseHTTPServer.HTTPServer 
handler_class = RequestHandler 
httpd = server_class(server_address, handler_class) 
httpd.serve_forever() 

当我改变__init__命令,它是正确的,为什么?

#!/usr/bin/env python 

import BaseHTTPServer 

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def __init__(self, request, client_address, server): 
     # change init order 
     print 'aaaa' 
     self.a = 0 
     BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) 
    def do_GET(self): 
     print self.a # I got 
     self.send_response(200) 
     self.send_header('Content-Type', 'text/plain') 
     self.end_headers() 

server_address = ('127.0.0.1', 8080) 
server_class = BaseHTTPServer.HTTPServer 
handler_class = RequestHandler 
httpd = server_class(server_address, handler_class) 
httpd.serve_forever() 

回答

4

因为该请求在BaseHTTPServer.BaseHTTPRequestHandler.__init__处理(准确的说,父类的__init__)。处理请求时

do_GET方法被调用;此时,self.a = 0未被执行;导致AttributeError


总之,do_GET方法是self.a线为第一代码之前调用。

  • RequestHandler.__init__
    • BaseHTTPServer.BaseHTTPRequestHandler.__init__(..)
      • ...
      • do_GET
      • ...
    • self.a = 0
+0

感谢您的解释:) – 5he1lc0de 2014-09-22 14:04:26

相关问题