2010-04-06 10 views
14

Mi sto chiedendo un buon modo per seguire se mi piacerebbe ridefinire i membri di una precedente classe definita in ipython. dire: Ho definito una classe intro come di seguito, e più avanti voglio ridefinire parte della definizione della funzione _print_api. Qualsiasi modo per farlo senza doverlo ridigitare.Un buon modo per modificare la classe definita precedente in ipython

class intro(object): 
    def _print_api(self,obj): 
      def _print(key): 
        if key.startswith('_'): 
          return '' 
        value = getattr(obj,key) 
        if not hasattr(value,im_func): 
          doc = type(valuee).__name__ 
        else: 
          if value.__doc__ is None: 
            doc = 'no docstring' 
          else: 
            doc = value.__doc__ 
        return '  %s  :%s' %(key,doc) 
        res = [_print(element) for element in dir(obj)] 
        return '\n'.join([element for element in res if element != '']) 
    def __get__(self,instance,klass): 
      if instance is not None: 
        return self._print(instance) 
      else: 
        return self._print_api(klass) 

risposta

0

Non c'è davvero un "buon" modo di farlo. Il meglio che puoi fare è qualcosa di simile:

# class defined as normally above, but now you want to change a funciton 
def new_print_api(self, obj): 
    # redefine the function (have to rewrite it) 
    ... 
# now set that function as the _print_api function in the intro class 
intro._print_api = new_print_api 

Ciò funzionerà anche se si dispone già di oggetti intro definiti (vale a dire, quando si chiama introObject._print_api su un oggetto che è stato già creato chiamerà il nuovo funzione impostata). Sfortunatamente, devi ancora ridefinire la funzione, ma almeno non devi riscrivere l'intera classe.

A seconda del caso d'uso, la cosa migliore da fare è di averlo in un modulo separato. import la classe e, quando è necessario modificare qualcosa, utilizzare semplicemente la funzione reload(). Tuttavia, questo non influenzerà le precedenti istanze della classe (questo potrebbe o non potrebbe essere quello che vuoi).

0

Quando arrivi al punto in cui hai ottenuto tanto codice, è più semplice inserirla in un file e nello specifico import. Quindi, quando è necessario aggiornare, è possibile modificare il file ed eseguire nuovamente l'istruzione import e si otterrà il codice aggiornato, sebbene gli oggetti definiti in precedenza non otterranno gli aggiornamenti.

+2

Per ottenere il codice aggiornato, è necessario utilizzare la funzione 'reload (modulename)' - l'esecuzione di 'import' di nuovo non avrà alcun effetto (credo che la ragione di ciò sia che se un grande programma importa la stessa cosa in più posizioni possibili non comporta una grossa penalizzazione delle prestazioni). –

5

Se si utilizzano le ipython% di modifica funzionalità, è possibile utilizzare qualcosa come this

10

Utilizzare il comando% di modifica, o il suo alias% ed. Supponendo che la classe introduttiva esista già nello spazio dei nomi ipython, digitando %ed intro si aprirà un editor esterno sul codice sorgente per la classe. Quando salvi ed esci dall'editor il codice verrà eseguito da ipython, ridefinendo efficacemente la classe.

Lo svantaggio di questo è che tutte le istanze che esistono già saranno comunque associate alla vecchia versione della classe - se questo è un problema allora è necessario ricreare gli oggetti o riassegnare l'oggetto. attributo classe per indicare la nuova versione della classe.

È inoltre possibile utilizzare %ed su moduli, file e linee di input precedenti, ad es. %ed 5 10:13 16 creerà e modificherà un file composto da linee di input ipython 5,10,11,12,13,16.

+0

Suggerimento davvero carino! Loving iPython more an more .. –

+5

Hmm, dovrebbe funzionare con classi/funzioni che sono * definite * in ipython o solo con quelle importate? Il caso "classes defined in ipython" non funziona per me, ottengo 'ATTENZIONE: il file 'None' dove '' non è stato definito. – weronika

+0

Questo è quello che sto cercando anche - un buon modo per modificare una classe che è stata definita in ipython. – Zitrax

Problemi correlati