2010-01-28 11 views
26

Supongamos que tenemos un objeto k de tipo class A. Definimos un segundo class B(A). ¿Cuál es la mejor práctica para "convertir" el objeto k en class B y conservar todos los datos en k?Conversión de objeto Python

+2

¿De qué manera está buscando convertir de una a la otra? ¿Desea mantener todas las variables miembro del objeto de clase B, pero usa el conjunto de métodos de la clase padre A? – BrainCore

+3

¿Es este bastante mal polimorfismo? ¿Son subclases A y B de una superclase común? Si es así, ¿esto es lo incorrecto que hacer? ¿Deseas que A tuviera los mismos métodos que B? Esto se hace a través de herencia múltiple. Explique por qué cree que necesita esto porque, en Python, lo está haciendo mal si cree que necesita conversión o conversión de tipo. –

+0

También es muy curioso acerca de su caso de uso. ¿Es solo por diversión, o ha encontrado que esta es una mejor manera de abordar algún problema, que no sea con la ayuda del polimorfismo clásico? –

Respuesta

17

Esto hace la "conversión de clase", sino que está sujeta a daños colaterales. Crear otro objeto y reemplazar su __dict__ como BrainCore publicado sería más seguro, pero este código hace lo que usted pidió, sin crear ningún objeto nuevo.

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 

¿Satisface esto su caso de uso? Nota: Solo las variables de instancia de b serán accesibles desde el objeto a, no las variables de clase de clase B. Además, la modificación de las variables de un modificarán la variable en b, a menos que haga un deepcopy:

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

En realidad, no se copiarán variables. Como 'a' y' b' ahora comparten el mismo '__dict__', la configuración' a.value' también cambia 'b.value'. –

+0

Tienes razón, corregido, gracias. – BrainCore

+0

En realidad, al hacer esto, el objeto "a" debe destruirse inmediatamente. El otro termina con dos objetos diferentes, en diferentes clases que comparten los mismos atributos; hay pocos escenarios peores que este. (Da miedo jugar incluso en el aviso interactivo) – jsbueno

Cuestiones relacionadas