Ho una serie di funzioni che servono per classificare i dati. Ogni funzione riceve lo stesso input. L'obiettivo di questo sistema è quello di essere in grado di inserire nuove funzioni di classificazione a volontà senza dover regolare nulla.Fudging la linea tra classi e funzioni
Per fare ciò, utilizzo una funzione classes_in_module
sollevata da here. Quindi, ogni classificatore in un file python verrà eseguito su ogni input.
Tuttavia, sto scoprendo che l'implementazione del classificatore come classe o funzione è kludgy. Le classi significano istanziazione ed esecuzione, mentre le funzioni mancano di introspezione pulita per permettermi di interrogare il nome o utilizzare l'ereditarietà per definire valori comuni.
Ecco un esempio. In primo luogo, l'implementazione della classe:
class AbstractClassifier(object):
@property
def name(self):
return self.__class__.__name__
class ClassifierA(AbstractClassifier):
def __init__(self, data):
self.data = data
def run(self):
return 1
Questo può quindi essere utilizzato in questo modo, supponendo che classifier_list
è l'uscita di classes_in_module
su un file contenente ClassifierA
tra gli altri:
result = []
for classifier in classifier_list:
c = classifier(data)
result.append(c.run())
Tuttavia, questo sembra un un po 'sciocco. Questa classe è ovviamente statica e non ha realmente bisogno di mantenere il proprio stato, poiché viene usata una volta e scartata. Il classificatore è davvero una funzione, ma poi perdo la possibilità di avere una proprietà condivisa name
- Dovrei usare la tecnica di introspezione brutta sys._getframe().f_code.co_name
e replicare quel codice per ogni funzione di classificazione. E anche qualsiasi altra proprietà condivisa tra i classificatori andrebbe persa.
Cosa ne pensi? Dovrei semplicemente accettare questo uso sbagliato delle classi? O c'è un modo migliore?
Le funzioni del classificatore devono davvero cercare il proprio nome? – jwodder
Forse il compromesso sarebbe utilizzare il decoratore '@ staticmethod'? – nthall
@jwodder renderebbe le cose più convenienti. Hai ragione, però, che potrei risolvere il problema del nome. Tuttavia, ci sono ancora altre proprietà condivise nella classe base astratta che non ho incluso nell'esempio. –