Un approccio orientato agli oggetti e fare la vostra funzione di una classe, in arte come un "functor", le cui istanze automaticamente tenere traccia di se sono stati eseguiti o meno quando ogni istanza viene creata.
Poiché la tua domanda aggiornata indica che potrebbero essere necessari molti di essi, ho aggiornato la mia risposta per gestirlo utilizzando uno schema class factory. Questo è un po 'insolito, e potrebbe essere stato sottovalutato per questo motivo (anche se non lo sapremo mai con certezza perché non hanno mai lasciato un commento). Potrebbe anche essere fatto con un metaclass, ma non è molto più semplice.
def RunOnceFactory():
class RunOnceBase(object): # abstract base class
_shared_state = {} # shared state of all instances (borg pattern)
has_run = False
def __init__(self, *args, **kwargs):
self.__dict__ = self._shared_state
if not self.has_run:
self.stuff_done_once(*args, **kwargs)
self.has_run = True
return RunOnceBase
if __name__ == '__main__':
class MyFunction1(RunOnceFactory()):
def stuff_done_once(self, *args, **kwargs):
print("MyFunction1.stuff_done_once() called")
class MyFunction2(RunOnceFactory()):
def stuff_done_once(self, *args, **kwargs):
print("MyFunction2.stuff_done_once() called")
for _ in range(10):
MyFunction1() # will only call its stuff_done_once() method once
MyFunction2() # ditto
uscita:
MyFunction1.stuff_done_once() called
MyFunction2.stuff_done_once() called
Nota: Si potrebbe fare una funzione/classe in grado di fare ancora una volta cose con l'aggiunta di un metodo reset()
alla sua sottoclasse che reimpostare l'attributo condiviso has_run
. È anche possibile passare argomenti regolari e parole chiave al metodo stuff_done_once()
quando viene creato il functor e viene chiamato il metodo, se lo si desidera.
E, sì, sarebbe applicabile date le informazioni che hai aggiunto alla tua domanda.
Se è necessario eseguire una volta, perché non chiamare la funzione -> myFunction() una volta !!. Si prega di dare un'occhiata al codice, spiegare meglio l'intento.! – pyfunc
Perché non puoi lasciarlo fuori dal giro? Più contesto per favore. – EightyEight
@pyfunc Fammi sapere se la modifica del codice trasmette più chiaramente il problema. – Ron