Класс с аргументами как аргумент в функции
Всем привет! Есть одна функция которая принимает класс как аргумент, но у этого класса нельзя вызвать аргументы самого класса, а если я вызову класс вместе с аргументами, произойдёт ошибка TypeError: 'SubProcessor' object is not callable, код:
from http.server import BaseHTTPRequestHandler, HTTPServer
class SubProcessor(BaseHTTPRequestHandler):
def __init__(self, getRoutes, postRoutes): # сами аргументы в __init__
print(getRoutes, postRoutes)
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
class Sub:
def __init__(self):
self.getRoutes = []
self.postRoutes = []
def get(self, route):
def getWrapper(func):
self.getRoutes.append({'route': route, 'func': func})
return getWrapper
def post(self, route):
def postWrapper(func):
self.postRoutes.append({'route': route, 'func': func})
return postWrapper
def serve(self, port):
self.server = HTTPServer(("", 8080), SubProcessor(self.getRoutes, self.postRoutes)) # мне нужно передать в класс аргументы
self.server.serve_forever()
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
я не знаю как у вас вызываются методы get, post, serve, поэтому я их вызвал в лоб. Попробуйте:
from http.server import BaseHTTPRequestHandler, HTTPServer
class SubProcessor(BaseHTTPRequestHandler):
def __init__(self, getRoutes, postRoutes): # сами аргументы в __init__
self.getRoutes = getRoutes
self.postRoutes = postRoutes
print(f'\n >>> {self.getRoutes}, {self.postRoutes}') # !
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
class Sub:
def __init__(self):
self.getRoutes = []
self.postRoutes = []
self.get(route='route123') # !
print(f'getRoutes -> {self.getRoutes}')
self.post(route='route789') # !
print(f'postRoutes -> {self.postRoutes}')
self.serve(port='8080') # !
def get(self, route):
def getWrapper(func):
#print(f'func -> `{func}`')
self.getRoutes.append({'route': route, 'func': func})
# return getWrapper
return getWrapper('func123') # !
def post(self, route):
def postWrapper(func):
self.postRoutes.append({'route': route, 'func': func})
# return postWrapper
return postWrapper('func789') # !
def serve(self, port):
# # мне нужно передать в класс аргументы
self.server = HTTPServer(("", 8080), SubProcessor(self.getRoutes, self.postRoutes))
self.server.serve_forever()
sub = Sub()
Автор решения: extrn
→ Ссылка
Передавать не обязательно именно класс. Достаточно передать что-то, что сконструирует его объект, например функцию. Только не забудьте проинициализировать базовый класс обработчика.
from functools import partial
class SubProcessor(BaseHTTPRequestHandler):
def __init__(self, *args, getRoutes, postRoutes):
super().__init__(*args)
print(getRoutes, postRoutes)
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
class Sub:
...
def serve(self, port):
self.server = HTTPServer(("", 8080),
partial(SubProcessor,
getRoutes=self.getRoutes,
postRoutes=self.postRoutes))
self.server.serve_forever()
Также можно объявить класс прямо в методе
def serve(self, port):
class SubProcessor(BaseHTTPRequestHandler):
# Здесь self: SubProcessor
# V а здесь и здесь self: Sub
def __init__(self, *args, getRoutes=self.getRoutes, postRoutes=self.postRoutes):
super().__init__(*args)
print(getRoutes, postRoutes)
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.server = HTTPServer(("", 8080), SubProcessor)
self.server.serve_forever()
