2010-01-28 15 views
26

Si supponga di avere un oggetto k di tipo class A. Abbiamo definito un secondo class B(A). Qual è la migliore pratica per "convertire" l'oggetto in class B e conservare tutti i dati in ?Conversione oggetto Python

+2

In che modo stai cercando di convertire da uno all'altro? Vuoi mantenere tutte le variabili membro dell'oggetto di classe B, ma usa il set di metodi della classe madre A? – BrainCore

+3

Questo Polymorphism è piuttosto scadente? Le sottoclassi A e B di una superclasse comune? Se è così, questa è la cosa sbagliata da fare? Ti piacerebbe che A avesse gli stessi metodi di B? Questo viene fatto attraverso l'ereditarietà multipla. Spiega perché pensi di averne bisogno perché - in Python - stai sbagliando se pensi di aver bisogno della conversione o della conversione del tipo. –

+0

Anche molto curioso del tuo caso d'uso. È solo per divertimento o hai trovato che questo è un modo migliore per affrontare qualche problema, se non con l'aiuto del polimorfismo classico? –

risposta

17

Questo fa la "conversione di classe", ma è soggetto a danni collaterali. Creare un altro oggetto e sostituire il suo __dict__ come pubblicato da BrainCore sarebbe più sicuro - ma questo codice fa quello che hai chiesto, senza creare nuovi oggetti.

class A(object): 
    pass 

class B(A): 
    def __add__(self, other): 
     return self.value + other 


a = A() 
a.value = 5 

a.__class__ = B 

print a + 10 
7
a = A() # parent class 
b = B() # subclass 
b.value = 3 # random setting of values 

a.__dict__ = b.__dict__ # give object a b's values 

# now proceed to use object a 

Questo soddisfa il tuo caso d'uso? Nota: solo le variabili di istanza di b saranno accessibili dall'oggetto a, non dalle variabili di classe della classe B. Inoltre, le variabili che modificano in un caso a modificare la variabile in B, a meno che non si fa un deepcopy:

import copy 
a.__dict__ = copy.deepcopy(b.__dict__) 
+1

In realtà, nessuna variabile verrà copiata. Dato che 'a' e' b' ora condividono entrambi lo stesso '__dict__', l'impostazione di' a.value' cambia anche 'b.value'. –

+0

Hai ragione, corretto, grazie. – BrainCore

+0

In questo caso, l'oggetto "a" dovrebbe essere distrutto immediatamente. Altrimenti uno finisce con due oggetti diversi, in classi diverse che condividono gli stessi attributi - ci sono pochi scenari peggiori di questo. (È spaventoso giocare anche al prompt interattivo) – jsbueno