sont définis par l'utilisateur classes mutable
Dis que je veux créer une classe pour car
, tractor
et boat
. Toutes ces classes ont une instance de engine
et j'ai envie de garder une trace de tous les moteurs dans une liste unique. Si je comprends bien, si le moteur de l'objet est mutable je peux le stocker comme un attribut de car
et aussi la même instance dans une liste.
Je ne peux pas trouver quelque solide info que définis par l'utilisateur classes sont mutables et si il y a un choix à choisir lorsque vous les définissez, quelqu'un peut jeter un peu de lumière?
Cela peut vous aider: stackoverflow.com/a/8056288/341459
Si vous avez 2 voitures, chacune avec la même marque et le modèle de moteur, vous voulez faire référence à la même
Vous êtes censé pour sélectionner les réponses à vos questions. Vous presque jamais le faire.
Bien repérés, et merci pour le tuyau, il y a certainement un peu je n'ai pas trouvé de réponse je trouve totalement réponses à la question, mais aussi il y a quelques moi devrait marquer comme réponse, Malade remedie que
Si vous avez 2 voitures, chacune avec la même marque et le modèle de moteur, vous voulez faire référence à la même
engine
objet, ou différentes (mais équivalent) engine
objets?Vous êtes censé pour sélectionner les réponses à vos questions. Vous presque jamais le faire.
Bien repérés, et merci pour le tuyau, il y a certainement un peu je n'ai pas trouvé de réponse je trouve totalement réponses à la question, mais aussi il y a quelques moi devrait marquer comme réponse, Malade remedie que
OriginalL'auteur jonathan topf | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Classes de l'utilisateur sont considérées comme mutables. Python n'a pas (absolument) privé attributs, de sorte que vous pouvez toujours changer d'une classe d'intervenir dans le fonctionnement interne.
Pour l'utilisation de votre classe comme une clé dans une
dict
ou de les stocker dans unset
, vous pouvez définir un.__hash__()
méthode et un.__eq__()
méthode, une promesse que votre classe est immuable. Vous, en général, de la conception de votre classe de l'API de ne pas la mutation de l'état interne après la création dans de tels cas.Par exemple, si vos moteurs sont uniquement définis par leur id, vous pouvez l'utiliser comme base de votre hash:
Maintenant, vous pouvez utiliser des instances de la classe Moteur par sous-ensembles:
Dans l'exemple ci-dessus-je ajouter un autre
Engine(1)
exemple à l'ensemble, mais il est reconnu comme étant déjà présent, et le jeu n'a pas changé.Remarque que dans la mesure où les listes sont concernés, le
.__eq__()
mise en œuvre est le plus important; les listes ne m'inquiète pas si un objet est mutable ou pas, mais avec le.__eq__()
méthode en place, vous pouvez tester si un moteur est déjà dans une liste:id
peut être source de confusion car il est un mot clé réservé en Python.Je pense qu'il est intéressant de souligner que définis par l'utilisateur classes ont
__hash__
déjà mis en œuvre (pour Disponible,__hash__
par défautid(self)
, de sorte qu'ils être utilisé comme dictionnaire des clés... mais alors vous devez utiliser la même classe à chaque fois que vous voulez obtenir d'un élément dans le dictionnaire.Mais vous n'avez pas assurez-vous il n'y aura pas deux instances avec le même ID.
Nope, je n'ai pas. Notez que l'OP n'a pas (explicitement) de demander que soit. Aussi, vous n'avez pas nécessairement pour prévenir les instances multiples avec le même identifiant, le code traite comme la même.
OriginalL'auteur Martijn Pieters
Tous les objets (à l'exception de quelques-uns dans la bibliothèque standard, et que mettre en place des mécanismes d'accès en utilisant des choses comme des descripteurs et des décorateurs, ou certaines mises en œuvre en C) sont mutables. Cela comprend les instances de l'utilisateur défini par les classes, les classes elles-mêmes, et même le type d'objets qui définissent les classes. Vous pouvez même muter un objet de classe au moment de l'exécution et ont les modifications manifeste dans les instances de la classe créée avant la modification. En gros, les choses ne sont immuables par convention en Python si vous creusez assez profond.
OriginalL'auteur Silas Ray
Je pense que vous êtes confus mutabilité avec la façon python garde références -- Considérer:
Maintenant à votre question sur l'obtention d'/stocker une liste de moteurs de l'échelle, Il ya quelques façons de le faire, en voici une:
L'exemple ci-dessus pourrait être un peu améliorée, en ayant la
EngineFactory._engines
dict magasinweakref.ref
objets au lieu de les stocker des références à des objets. Dans ce cas, vous devriez vérifier pour s'assurer que la référence est encore en vie (n'a pas été nettoyée) avant de retourner une nouvelle référence à l'objet.OriginalL'auteur mgilson
EDIT: C'est conceptuellement mal, L'immuable objet en python peut répandre la lumière de la raison.
imprime
True
.Qu'est-ce que avez à faire avec la question? Vous ne fournissez aucune explication sur les raisons de ce code est pertinent.
J'ai pensé que l'a montré comment l'OP peut "stocker comme un attribut de la voiture et aussi la même instance dans une liste"
J'ai eu tort, cependant, ajouté un lien qui peut être pertinent.
la lecture de la question à quelques reprises, je ne pense pas que vous étiez loin. Je pense que votre réponse pourrait utiliser un peu de travail à expliquer pourquoi il est pertinent, mais je ne pense pas que l'OP comprend vraiment références python (et en quelque sorte a obtenu que la confondre avec la mutabilité).
OriginalL'auteur Lev Levitsky