Fammi illustrare con un esempio.
Dire che voglio creare una classe Returns
che generi i ritorni di uno stock, per esempio. I ritorni possono essere aritmetici o logaritmici e voglio essere in grado di scegliere l'istanza che voglio. Per il momento, faccio quanto segue:
def arithmetic(prices):
daily_ret = []
for i rows in prices:
returns.append(prices(i)-prices(i-1))
return daily_ret
def logarithmic(prices):
daily_ret = []
for i rows in prices:
returns.append(np.ln(prices(i) / prices(i-1))
return daily_ret
class Returns:
def __init__(self, stock_ticker, return_calc=arithmetic):
self.stock_ticker = stock_ticker
self.return_calc = return_calc
def calculate_returns(self):
get_price_data_from_ticker = whatever_data_source()
if self.return_calc = 'arithmetic':
returns = arithmetic(get_price_data_from_ticker)
elif self.return_calc = 'logarithmic':
returns = logarithmic(get_price_data_from_ticker)
return returns
x = Returns('AAPL US Equity', return_calc='logarithmic')
print(x.calculate_returns())
Sembra che il codice sia scritto male, e mi manca qualcosa di ovvio perché ho sempre avuto la stessa domanda.
Un'altra cosa che ho fatto è usare getattr per ottenere in modo dinamico il nome della funzione o della classe che userò e trasmetterò gli argomenti. Un'altra cosa che ho trovato è usare globals () per creare dinamicamente le classi.
Mi chiedo se ci sia una macro costruzione che mi manca, perché anche se queste 2 soluzioni sopra sembrano piuttosto belle, sembra che ci sia un problema strutturale più profondo con il codice.
La lingua è Python 3