web-dev-qa-db-fra.com

Python: comment "tuer" une instance / un objet de classe?

Je veux qu'une classe Roach "meure" lorsqu'elle atteint un certain niveau de "faim", mais je ne sais pas comment supprimer l'instance. Je fais peut-être une erreur avec ma terminologie, mais ce que je veux dire, c'est que j'ai une tonne de "cafards" sur la fenêtre et je veux que certains spécifiques disparaissent complètement.

Je vous montrerais le code, mais c'est assez long. J'ai la classe Roach ajoutée à une liste de population de gardons de classes Mastermind.

27
user2407969

En général:

  • Chaque variable de liaison -> objet augmente le compteur de référence de l'objet interne
  • il existe plusieurs façons habituelles de diminuer la référence (objet de déréférence -> liaison de variable):

    1. sortie du bloc de code où la variable a été déclarée (utilisée pour la première fois)
    2. l'objet destructeur libérera les références de tous les attributs/variable de méthode -> références d'objet
    3. appelant del variable supprimera également la référence dans le contexte actuel
  • une fois que toutes les références à un objet ont été supprimées (compteur == 0), il devient un bon candidat pour le garbage collection, mais il n'est pas garanti qu'il sera traité ( référence ici ):

CPython utilise actuellement un schéma de comptage de références avec (facultatif) détection retardée des ordures liées cycliquement, qui collecte la plupart des objets dès qu'ils deviennent inaccessibles, mais il n'est pas garanti de collecter les ordures contenant des références circulaires. Voir la documentation du module gc pour des informations sur le contrôle de la collecte des ordures cycliques. D'autres implémentations agissent différemment et CPython peut changer. Ne dépendez pas de la finalisation immédiate des objets lorsqu'ils deviennent inaccessibles (ex: toujours fermer les fichiers).

20
Robert Lujo

Vous ne pouvez pas forcer un Python à supprimer; il sera supprimé lorsque rien ne le référencera (ou lorsqu'il se trouvera dans un cycle uniquement désigné comme étant les éléments du cycle). Vous devrez dire votre "Mastermind" pour effacer sa référence.

del somemastermind.roaches[n]
11
for i,roach in enumerate(roachpopulation_list)
        if roach.hunger == 100
            del roachpopulation_list[i]
            break

Supprimez l'instance en la supprimant de votre liste de population (contenant toutes les instances de gardon.

Si vos cafards sont des sprites créés dans Pygame, une simple commande de .kill supprimerait l'instance.

1
Beatrix Kidco