'Class' 属性没有属性 'variable'

'Class' Attribute has no attribute 'variable'

我知道此类问题已经被经常提出。尽管如此,在查看了大量线程后,我仍无法确定问题所在。

#!/usr/bin/env python
# Reflects the requests with dummy responses from HTTP methods GET, POST, PUT, and DELETE
# Written by Tushar Dwivedi (2017)


import json
# from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
import sys
sys.path.append(r'C:\Users\[...]')
from http.server import BaseHTTPRequestHandler,HTTPServer
from optparse import OptionParser

class RequestHandler(BaseHTTPRequestHandler):

    def __init__(self, *args, **kwargs):
        BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
        self.dummy_var = None

    def do_GET(self):
        request_path = self.path

        print("\n----- Request Start ----->\n")
        print("request_path :", request_path)
        print("self.headers :", self.headers)
        print("<----- Request End -----\n")

        self.send_response(200)
        self.send_header("Set-Cookie", "foo=bar")
        self.end_headers()

        self.wfile.write(json.dumps({'value_1': str(self.calc_value()), 'value_2': '0'}).encode())

    def calc_value(self):
        if self.dummy_var is None:
            self.dummy_var = 0

        self.dummy_var = self.dummy_var + 1

        return self.dummy_var

    do_PUT = do_POST
    do_DELETE = do_GET

def main():
    port = 8000
    print('Listening on localhost:%s' % port)
    server = HTTPServer(('', port), RequestHandler)
    server.serve_forever()

if __name__ == "__main__":
    parser = OptionParser()
    parser.usage = ("Creates an http-server that will echo out any GET or POST parameters, and respond with dummy data\n"
                    "Run:\n\n")
    (options, args) = parser.parse_args()

    main()

我正在启动服务器并从第二个脚本发出请求,

r = requests.get('http://localhost:8000').json()

基本思路(用于测试)是每次发出请求时,dummy_var 充当计数器。

但是,我收到以下错误:

  File "C:\Users\[...]\http_server.py", line 60, in calc_value
    if self.__dummy_var is None:
AttributeError: 'RequestHandler' object has no attribute 'dummy_var'

有什么建议吗?

我确实检查了缩进,但它似乎全是空格,没有制表符。

由于很难从评论中看到必要的更改,我认为值得在这里分享。

解决方法是在调用__init__()之前设置属性,并使用super()进行协同继承。因此,init 方法应更改为以下行:

def __init__(self, *args, **kwargs):
    self.dummy_var = None 
    super().__init__(*args, **kwargs)