2010-01-28 8 views
26

Supposons que nous ayons un objet k de type class A. Nous avons défini un second class B(A). Quelle est la meilleure pratique pour "convertir" l'objet k en class B et conserver toutes les données dans k?Conversion d'objet Python

+2

De quelle façon cherchez-vous à passer de l'un à l'autre? Souhaitez-vous conserver toutes les variables membres de l'objet classe B, mais utiliser l'ensemble des méthodes de la classe parent A? – BrainCore

+3

Est-ce que c'est un assez pauvre polymorphisme? Les sous-classes A et B d'une superclasse commune? Si oui, c'est la mauvaise chose à faire? Souhaitez-vous que A ait eu les mêmes méthodes que B? Ceci est fait par héritage multiple. Veuillez expliquer pourquoi vous pensez en avoir besoin car - en Python - vous vous trompez si vous pensez avoir besoin d'un casting ou d'une conversion de type. –

+0

Aussi vraiment curieux de votre cas d'utilisation. Est-ce juste pour le plaisir, ou avez-vous trouvé que c'était une meilleure façon d'aborder un problème, autre qu'avec l'aide du polymorphisme classique? –

Répondre

17

Cela ne la « conversion de classe », mais elle est soumise à des dommages collatéraux. Créer un autre objet et remplacer son __dict__ par BrainCore posté serait plus sûr - mais ce code répond à ce que vous avez demandé, sans créer d'objet.

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 

Cela répondrait-il à votre utilisation? Remarque: Seules les variables d'instance de b seront accessibles à partir de l'objet a et non des variables de classe de la classe B. En outre, la modification des variables dans un modifieront la variable b, sauf si vous faites un deepcopy:

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

En fait, aucune variable ne sera copiée. Puisque 'a' et' b' partagent tous les deux le même '__dict__', la valeur' a.value' change aussi 'b.value'. –

+0

Vous avez raison, corrigé, merci. – BrainCore

+0

En fait, l'objet "a" devrait être détruit immédiatement. Sinon, on se retrouve avec deux objets différents, dans des classes différentes partageant les mêmes attributs - il y a quelques pires scénarios que celui-ci. (Il est effrayant de jouer même à l'invite interactive) – jsbueno

Questions connexes