2009-11-25 14 views
8

Sembra che Python abbia alcune limitazioni relative ai metodi di istanza.Superamento dei limiti di Python relativi ai metodi di istanza

  1. I metodi di istanza non possono essere copiati.
  2. I metodi di istanza non possono essere sottoposti a decapaggio.

Questo è problematico per me, perché lavoro su un oggetto orientato project in cui riferisco metodi istanza, e c'è utilizzo sia deepcopying e decapaggio. La questione del decapaggio viene eseguita principalmente dal meccanismo di multiprocessing.

Quale sarebbe un buon modo per risolvere questo? Ho fatto qualche brutta soluzione al problema della copia, ma Sto cercando una soluzione migliore per entrambi i problemi.

Qualcuno ha qualche suggerimento?

Aggiornamento:

mio caso d'uso: Ho un sistema di eventi molto piccolo. Ogni evento ha un attributo .action che punta a una funzione che deve attivare e, a volte, tale funzione è un metodo di istanza di alcuni oggetti.

+5

In genere, forniamo il codice in tutte le posizioni in cui stiamo lavorando e spostiamo semplicemente una rappresentazione dello stato circostante. Il trasferimento dello stato di rappresentanza è più comune e più semplice. Cosa c'è che non va? –

+0

S.Lott, hai chiaramente più esperienza con questo problema, ma ti prego di spiegarmelo in un modo più stupido, che cosa stai suggerendo esattamente, in che modo si riferisce, cos'è "Representation State Transfer", ecc. –

+0

Stai dicendo "Voglio mettere sott'occhio i metodi di istanza", ma non stai dicendo perché. Ci aiuterebbe a capire quale problema stai cercando di risolvere, poiché potrebbe esserci un modo più pititico per farlo. Sembra un po 'come stai pensando in Ruby ... –

risposta

15

Potrebbe essere possibile farlo utilizzando copy_reg.pickle. In Python 2.6:

import copy_reg 
import types 

def reduce_method(m): 
    return (getattr, (m.__self__, m.__func__.__name__)) 

copy_reg.pickle(types.MethodType, reduce_method) 

Questo non memorizza il codice del metodo, basta il suo nome; ma funzionerà correttamente nel caso comune.

Questo rende sia il lavoro di decapaggio che di copia!

+0

Buona idea, penso che potrebbe essere la soluzione più pulita. Hai qualche idea per l'altro problema, copiare? Inoltre, qualcuno ha già implementato una soluzione 'copy_reg' che posso usare? –

+0

Ho modificato la risposta e aggiunto del codice. –

3

REST - Trasferimento stato di rappresentanza. Basta inviare lo stato, non i metodi.

Per trasferire un oggetto X da A a B, lo facciamo.

  1. A codificare lo stato di X in qualche a portata di mano la notazione, facile da analizzare. JSON è popolare.

  2. A invia il testo JSON a B.

  3. B decodifica lo stato di forma X JSON notazione, ricostruendo X.

B devono avere le definizioni di classe per la classe di X per questo lavorare. B deve avere tutte le funzioni e le altre definizioni di classe da cui dipende la classe di X. In breve, sia A sia B hanno tutte le definizioni. Viene spostata solo una rappresentazione dello stato dell'oggetto .

Vedere qualsiasi articolo su REST.

http://en.wikipedia.org/wiki/Representational_State_Transfer

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

+0

Puoi spiegare come questa metodologia si riferisce al mio problema con il sistema degli eventi? –

+4

Questa è una risposta "stai sbagliando". Questa visione è che 'pickle' è forse un po '* troppo * conveniente in Python; è molto meglio scambiare Plain Old Data (al contrario dei grafici degli oggetti) perché si traduce in sistemi più semplici a cui è più ragionevole ragionare. C'è qualcosa in questo, ma se è utile a tutti voi sarà utile in un modo a lungo termine. –

-3

salamoia l'istanza e quindi accedere al metodo dopo deserializzazione esso. Decapitare un metodo di un'istanza non ha senso perché si basa sull'istanza. In caso contrario, scriverlo come funzione indipendente.

import pickle 

class A: 
    def f(self): 
     print 'hi' 

x = A() 
f = open('tmp', 'w') 
r = pickle.dump(x, f) 
f.close() 
f = open('tmp', 'r') 
pickled_x = pickle.load(f) 
pickled_x.f() 
+1

A() non è un metodo di istanza. –

+1

Hai decapitato l'oggetto, non il metodo di istanza. Prova a decapitare direttamente un metodo di istanza. –

+0

pickle l'istanza e quindi accedere al metodo dopo averlo deselezionato. Il decollo di un metodo di un'istanza non ha senso perché si basa sull'istanza. In caso contrario, scriverlo come funzione indipendente. –

Problemi correlati