Callables in Elternklasse
Verfasst: Mittwoch 10. April 2019, 08:02
Folgendes Problem:
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:
Der Code ist zur vereinfacht. Beim Schreiben fiel mir wieder "Explicit is better than implicit" ein, mir fehlt hier schlicht die Erfahrung weshalb ich mich frage ob es hier noch andere Möglichkeiten gibt als jeder Subklasse direkt eine Instanz von Client() zu übergeben.
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()