ich verwende ein Webframework (Tornado) und habe eine Elternklasse "BaseHandler" geschrieben in denen einige Methoden und Attribute vorhanden sind, die ich in mehreren Subklassen (bestimmte Ressourcen-Handler) vererben möchte.
Das ganze funktioniert problemlos, jedoch stört mich eine Sache und ich weiß nicht ob mein Ansatz irgendwas besser machen würde außer der Lesbarkeit. In jedem Handler verwende ich ein Objekt von "Client()", daher wollte ich das über BaseHandler allen erbenden Klassen verfügbar machen, so dass dann via self.client automagisch darauf zugegriffen werden kann.
Naiver Ansatz:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime
import logging.config
import sys
from typing import ClassVar, Callable
import yaml
from dateutil import tz
from tornado import web, ioloop
from app import Client()
SERVICE_NAME = 'Example Service'
LOG = logging.getLogger(SERVICE_NAME)
TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S.%f%z"
class BaseHandler(web.RequestHandler):
web_client: ClassVar[Callable]
def write_error(self, status_code, **kwargs):
self.finish({
"code": status_code,
"message": self._reason,
"ts": datetime.datetime.now(
tz=tz.tzlocal()).strftime(TIMESTAMP_FORMAT),
})
def finish(self, chunk=None):
self.set_header("Server", SERVICE_NAME)
super().finish(chunk=chunk)
class Handler1(BaseHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
def initialize(self, name):
self.name = name
class Handler2(BaseHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
def initialize(self, name):
self.name = name
class Handler3(BaseHandler):
def __init__(self, application, request, **kwargs):
super().__init__(application, request, **kwargs)
def initialize(self, name):
self.name = name
def main():
with open(sys.argv[1], 'r') as config_file:
config = yaml.load(config_file, Loader=yaml.FullLoader)
var1 = config['bla']['a']
var2 = config['bla']['b']
var3 = config['bla']['c']
client = Client()
BaseHandler.web_client = client
application = web.Application([(
"/rest/v1/store", Handler1, {'name': var1},
"/rest/v1/search", Handler2, {'name': var2},
"/rest/v1/index", Handler3, {'name': var3}
)])
application.listen(config['service']['port'])
ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()