Thank you so much everyone for such quick answers!
Even though the Factory method pattern feels like a very concrete way of going forward, I chose the __new__
method override suggested by Juanpa, mainy because I'm lazy :)
My PDFRenderer
class now looks something like this
def __new__(cls, *args, **kwargs):
if settings.USE_PDF_RENDERER.lower() == "reportlab":
# Keep it here to avoid circular import
from .reportlab import ReportlabRenderer
cls = ReportlabRenderer
else:
raise ValueError(f"Unsupported PDF renderer: {settings.USE_PDF_RENDERER}! Ensure the 'USE_PDF_RENDERER' setting is set to 'reportlab' in the project settings.")
return object.__new__(cls)
where the project settings (django) parameter decides which renderer to opt for. Overall this fits in nicely with the Django way of doing it so I chose to go this route.