TypeError:__init __()缺少3个必需的位置参数

时间:2019-02-25 17:37:52

标签: python

我正在构建一个使用http.server处理HTTP GET请求的类,这是我到目前为止编写的:

class webServerHandler(BaseHTTPRequestHandler):
    __HOST = "localhost"
    __PORT = 8080

    # Custom GET response
    def do_GET(self):
        page_content = self.htmlHandler()
        self.wfile.write(page_content) # Send web page

    # HTML code
    def htmlHandler(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        msg = '''
        <html><head><title>Test</title></head>
        <body><h1><center>Test</center></h1></body>
        </html>
        '''
        return bytes(msg, "UTF-8") # UTF-8 Format

    # Run the server
    def serverStart(self):
        # init HTTP Daemon
        http_daemon = HTTPServer((self.__HOST, self.__PORT), webServerHandler)
        http_daemon.serve_forever()
        print("Info: Server started")

我用以下命令执行它:

server = webServerHandler()
server.serverStart()

当我尝试执行它时,会给我这个错误:

TypeError: __init__() missing 3 required positional arguments: 'request', 'client_address', and 'server'

我做错了什么?

2 个答案:

答案 0 :(得分:2)

之所以发生此错误,是因为BaseHTTPRequestHandler具有3 required arguments,因此您的webServerHandler类扩展了BaseHTTPRequestHandler并且没有覆盖构造方法也< / em>具有相同的必需参数。

当您需要webServerHandler()webServerHandler和{{1}来调用request时,您将不带任何参数地调用client_address }参数。

答案 1 :(得分:1)

让我们遵循MRO:

In [351]: http.server.BaseHTTPRequestHandler.__mro__
Out[351]: 
(http.server.BaseHTTPRequestHandler,
 socketserver.StreamRequestHandler,
 socketserver.BaseRequestHandler,
 object)

并且__init__socketserver.BaseRequestHandler中定义:

def __init__(self, request, client_address, server):
    self.request = request
    self.client_address = client_address
    self.server = server
    self.setup()
    try:
        self.handle()
    finally:
        self.finish()

如您所见,您需要提供所需的3个位置参数(requestclient_addressserver),以实例化异常中提到的实例。