我无法在python中继承BaseHTTPServer来访问成员,为什么?

时间:2014-09-22 13:32:58

标签: python python-2.7

我在python中编写了一个http服务器程序,我的RequestHandler类继承自BaseHTTPServer,它初始化一个成员a,但是我无法访问它,其中BaseHTTPServer是第一个init语句,当我更改init语句顺序时,它将是正确的。

#!/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()

1 个答案:

答案 0 :(得分: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