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
Répondre
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
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__)
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'. –
Vous avez raison, corrigé, merci. – BrainCore
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
- 1. Python C# conversion
- 2. Conversion de type Python
- 3. Conversion d'objets python pour rpy2
- 4. Aide conversion application Python C#
- 5. Python: conversion de chaîne binaire/hexadécimale?
- 6. Conversion Python en ISO-8859-5
- 7. Python fichier Slurp w/conversion endian
- 8. Réflexion Python et conversion de type
- 9. Conversion de variables python en variables javascript
- 10. Python .flv conversion de fichier multimédia
- 11. Conversion Python de chaîne binaire en hexadécimal
- 12. conversion de chaîne de python pour eval
- 13. conversion de format de date Python OLE2
- 14. Conversion de code Python en PHP
- 15. Conversion d'un python expression numérique LATEX
- 16. Ruby à python conversion en une ligne
- 17. Conversion d'une chaîne en liste en Python
- 18. Conversion de Python datetime en rfc 2822
- 19. Conversion d'entités XML/HTML en chaîne Unicode en Python
- 20. Matlab à la conversion Python code (NumPy, SciPy, Matplotlib?)
- 21. Problème avec la conversion PPT en utilisant python-Django
- 22. Conversion de traversée de graphe en multitraitement en Python
- 23. Conversion d'un horodatage inconnu en datetime en Python
- 24. Conversion des entités html dans leurs valeurs en python
- 25. Python: la conversion de chaînes pour une utilisation avec ctypes.c_void_p()
- 26. Conversion d'un objet Doc en une chaîne en python
- 27. Conversion de utf-16 en utf-8 en Python 3
- 28. Conversion de commandes SQL en ORM de Python
- 29. Python 3: Conversion d'image en niveaux de gris
- 30. Conversion d'une liste de listes à un tuple en Python
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
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. –
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? –