Je travaille sur mon premier projet Python et je manque déjà des événements dans mes cours. Peut-être que ce n'est même pas appelé des événements à Python, mais j'aimerais créer des "groupes" dans mes classes auxquelles des références de fonctions peuvent être ajoutées. À un moment donné de ma classe, toutes les références de fonction dans mon groupe s'exécuteraient. P>
Est-ce intégré à Python? (J'utilise 2,7 pour le moment) P>
3 Réponses :
Python n'a pas de sorte de système d'événements intégré, mais il pourrait être mis en œuvre assez simplement. Par exemple:
Trois notes cependant: (1) Il est proprement mieux de définir auto.Callbacks = {} code> dans
__ init __ code> et évitez la variable de la classe Bogus (surtout que certains pauvres imbécile pourraient écraser) . (2) Dans la même veine,
Self.Callbacks code> devrait être privé, c'est-à-dire
self._callbacks code>. (3)
collections.defaultDict (liste) code> simplifie l'ajout de gestionnaires car vous n'avez pas besoin de différencier s'il existe déjà des rappels pour un nom d'événement donné.
Généralement, je suis d'accord. J'ai choisi d'utiliser cette méthode parce que c'était la plus autonome, pour la commodité des personnes moins familières avec la langue (si j'avais utilisée __ init __ code> alors l'utilisateur devrait faire face à la joie c'est
super () code>).
Votre profil me freaking me sort! Comment avez-vous réussi à obtenir "1" avec 70+ badges en or !?
@ Not2QuBit On dirait que le compte de Jeremy est temporairement suspendu par les modérateurs de trop-plein. À titre d'effet secondaire, cela signifie que les scores de réputation du compte sont verrouillés à «1». Les détails sont ici: Stackoverflow.blog/ 2009/04/06 / A-Day-in-the-Box / ...
@Neilsshoenfelder Wow. Je n'avais aucune idée que cela existait même. THX pour clarifier le lien.
tandis que la réponse de Jeremy Banks fonctionne très bien, ce n'est pas ce que la plupart appelleraient "Pythonic". Étant donné que cette question se pose assez facilement par le biais de moteurs de recherche, voici une réponse alternative qui témoigne pour utiliser les meilleures conventions de mon expérience: pour l'utiliser, vous créez simplement un événement Voici un exemple complet: p> CODE> Objet, puis inscrivez-vous des rappels auditeur en manipulant directement les écouteurs code> directement ou en utilisant le raccourci
+ = code>. Vous utilisez ensuite la méthode
notifier () code> pour appeler tous les auditeurs. Tous les arguments et mots clés passés à la méthode
notifier () code> seront transférés sur les auditeurs. P>
class Soldier:
# An event on a class level.
# Listening to just this will notify you of *any* person dying.
e_death = Event()
def __init__(self, name, health):
self.name = name
self.health = health
# Instance level event.
# Using this you need to listen to each person separately.
self.e_eat = Event()
def eat(self, amount):
self.health += amount
self.e_eat.notify(self, amount=amount)
def hurt(self, damage):
self.health -= damage
if self.health <= 0:
Soldier.e_death.notify(self)
Où est personne code> défini?
@Timo qui restait d'une gratte antérieure, je l'ai réparé pour utiliser la classe Soldier Code>. Merci!
@Markusmeskanen Pouvez-vous mettre à jour votre "exemple complet" pour utiliser également l'importation (ou autre) nécessaire pour faire avant d'exécuter ce code? De plus, je ne vois pas tout à fait la connexion ces i> au dernier soldat i> exemple. Peut-être que vous pouvez rendre votre exemple autonome, au lieu de mélanger avec la py cli?
Si quelqu'un est intéressé par la prise en charge des événements pour Python Version 3+, une bibliothèque de notification d'événement est disponible ( https://pypi.org/project/event-notifier/ ) p>
Il existe également une grande liste d'observations d'alternatives disponibles ici: p>
S'il vous plaît expliquer ce que vous entendez par événement. Il existe des exceptions (de différents noms et objectifs), mais ils ne sont pas vraiment des événements. Si vous parlez de choses telles que «OnClick» ou «ONKEYDOWD», vous obtenez cela de la bibliothèque Tkinter intégrée ou de la bibliothèque d'interface graphique écrite et intégrée à Python (autant que je sache, vous ne pouvez pas intégrer que avec un programme non-GUI). Quel comportement cherchez-vous exactement?
Peut-être devriez-vous rechercher "Python Modèle d'observateur". Il y a beaucoup de postes sur ce sujet.
Bien sûr, vous pouvez la mettre en œuvre. Bien sûr, votre besoin spécifique n'est pas pris en charge par le STDLIB, car il est probablement très spécifique à un domaine. Il pourrait être aussi simple que
auto.events [EventType] .add (gestionnaire) code> et
pour gestionnaire dans self.events [eventype]: gestionnaire (...) code> ou besoin Beaucoup plus de comptabilité en fonction de vos besoins. Donne des détails.
Chrono Kitsune: Je cherche un comportement très simple. J'ai des cours qui gèrent diverses tâches (serveurs d'hébergement, de traitement des bases de données, etc.). J'aimerais que mes scripts Python puissent indiquer à ces objets de classe d'exécuter des fonctions données sur la survenue d'un certain événement, par exemple
ClientConnected code> ou
TraitementComplete code>.