gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:33 25 4
gpt4 key购买 nike

我用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()

最佳答案

因为请求是在 BaseHTTPServer.BaseHTTPRequestHandler.__init__ 中处理的(准确地说,是父类(super class)的 __init__)。

do_GET 方法在处理请求时被调用;这时候self.a = 0没有执行;导致 AttributeError


简而言之,do_GET 方法在第一个代码的self.a 行之前被调用。

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

关于python - 我无法通过在 python 中继承 BaseHTTPServer 来访问成员,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25975452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com