disons que j'ai une classe qui se comporte comme un int pour le monde extérieur, mais en fait c'est un objet mutable qui a une place fixe dans plusieurs structures. Si n est mon objet, je peux le mettre à jour maintenant en écrivant n.update(34)
, mais je trouve que je veux toujours écrire n = 34
à la place. Je l'ai regardé sur http://docs.python.org/reference/datamodel.html, et ne vois rien comme un _ _ assign _ _ ou _ _ valeur _ _ attribut qui me permettrait de piéger l'opérateur =
et me permettre de mettre à jour mon objet plutôt que attribuer un entier à la variable n, jetant mon objet. mieux encore, quand un mutable est dans un tuple t = (m, n)
, je voudrais mettre à jour mon mutable avec t[1] = 34
, mais Python voit cela comme une tentative de modification d'un immutable. Donc, je suppose que la réponse serait, sur la base de ce peu de ce document que j'ai pu grok, que ce que je tente n'est pas Pythonic. donc si je ne peux pas le faire comme je le veux, quelle serait la prochaine meilleure chose? si quelqu'un doit maintenir mon code un jour, ce ne sera pas trop offensant.façon pythonique de modifier un mutable à l'intérieur d'un immutable
Répondre
Votre base obj.value = newvalue
est fondamentalement la meilleure et la plus compréhensible. Comme vous le supposez, il n'est pas possible de surcharger l'assignation en Python.
Vous pouvez implémenter __call__()
sur votre classe pour faire l'affectation, de sorte que vous pouvez simplement faire obj(newvalue)
. Cependant, il n'est pas du tout clair pour le lecteur occasionnel que c'est une réaffectation.
Une autre idée serait de mettre en œuvre __ilshift__()
de sorte que vous pouvez faire obj <<= newval
. Cela ressemble au moins à une opération de réaffectation mutante si vous plissez assez fort. Si ce n'était pas un type numérique, je pourrais le considérer. Mais <<
a une signification bien définie avec int
et, puisque vous êtes masquerading comme ce type, il serait IMHO être confus de l'utiliser de cette manière.
- 1. Scala - ListBuffer Mutable ou liste Immutable à choisir?
- 2. Comment créer une copie mutable d'un tableau immutable dans swift?
- 3. façon pythonique pour correspondre dictionnaires
- 4. Une façon plus pythonique d'itérer
- 5. Affectation, mutable à un tableau immuable?
- 6. Plus de façon pythonique pour trouver un brin d'ADN complémentaire
- 7. MutableDictionary devient immutable
- 8. pretty-print json en python (façon pythonique)
- 9. Meilleure façon d'initialiser un tableau multidimensionnel avec un objet mutable
- 10. Comment mapper une classe comme immutable à l'aide de FluentNHibernate?
- 11. La façon pythonique pour générer des paires
- 12. Liaison XAML à une structure immutable
- 13. façon pythonique pour envelopper xmlrpclib appelle à multicalls similaires
- 14. Modifier le champ de classe scala immutable par réflexion
- 15. Comment faire pour rendre une propriété immutable héritée mutable en C#?
- 16. Le tableau Mutable est automatiquement changé en immutable, tout en y ajoutant l'objet. Pourquoi?
- 17. Comment intégrer SQLAlchemy et un Numpy.ndarray sous-classé en douceur et de façon pythonique?
- 18. Plus de façon pythonique de sauter les lignes d'en-tête
- 19. façon pythonique de calculer une valeur à un objet de classe une seule fois
- 20. "Pythonique" façon de "réinitialiser" les variables d'un objet?
- 21. Structure immutable avec collection
- 22. Quelle est la façon la plus pythonique de déterminer l'endianisme?
- 23. façon pythonique de recueillir des données spécifiques de dict complexes
- 24. façon pythonique de diviser la chaîne en deux listes
- 25. La façon la plus «pythonique» de gérer la surcharge
- 26. Quelle est la façon pythonique de calculer le produit scalaire?
- 27. Le chargement d'une ressource à un bitmap mutable
- 28. façon pythonique pour mapper un ensemble de chaînes à des entiers
- 29. façon pythonique de supprimer des éléments d'un tableau numpy
- 30. façon pythonique faire exploser une liste de tuples
merci pour les idées, et pour améliorer ma compréhension limitée de ces concepts. Je vais laisser le code seul pour l'instant, car j'ai encore beaucoup de travail à faire, mais quand viendra le temps de faire une mise à jour, je prendrai une décision. –