Supponiamo che abbia una stringa per un nome di classe (o parte di un nome di classe), e ho un'implementazione da qualche parte. Tutto quello che voglio, è essere in grado di ottenere un'istanza di una classe con il nome nella variabile.
Ad esempio,
dynamic_class_name = "Circle" # not a constant, comes from somewhere
corresponding_class = some_magic(dynamic_class_name)
corresponding_instance = corresponding_class()
Riesco a pensare a diversi approcci dall'utilizzo della funzione __import__()
, delle ricerche degli attributi del modulo, aggiungendo register
alle classi, altri modi di usare gli spazi dei nomi, effettuando auto-registrazione tramite metaclassing, fino all'utilizzo dell'architettura di componenti pesanti e interfacce ...
La domanda è, quale sarebbe il modo più semplice ma elegante (comprensibile, intuitivo, regolare, non hacker) per sostituire il codice brutto come?
if dynamic_class_name == "Circle":
inst = Circle()
elif dynamic_class_name == "Square":
inst = Square()
...
Il bonus sarebbe avere un impatto minimo sulla capacità di IDE (come PyCharm) di dedurre tipi e istanze.
Un altro vantaggio è che non è necessario avere un elenco speciale con le classi in un unico posto, quindi è possibile inserire nuove classi.