9
votes

Les classes Python appuient-elles des événements comme d'autres langues?

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.

Est-ce intégré à Python? (J'utilise 2,7 pour le moment)


4 commentaires

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) et pour gestionnaire dans self.events [eventype]: gestionnaire (...) 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 ou TraitementComplete .


3 Réponses :


13
votes

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: xxx


5 commentaires

Trois notes cependant: (1) Il est proprement mieux de définir auto.Callbacks = {} dans __ init __ et évitez la variable de la classe Bogus (surtout que certains pauvres imbécile pourraient écraser) . (2) Dans la même veine, Self.Callbacks devrait être privé, c'est-à-dire self._callbacks . (3) collections.defaultDict (liste) 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 __ alors l'utilisateur devrait faire face à la joie c'est super () ).


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.



9
votes

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: xxx pré>

pour l'utiliser, vous créez simplement un événement 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>

Voici un exemple complet: 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)


3 commentaires

Où est personne défini?


@Timo qui restait d'une gratte antérieure, je l'ai réparé pour utiliser la classe Soldier . 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 au dernier soldat exemple. Peut-être que vous pouvez rendre votre exemple autonome, au lieu de mélanger avec la py cli?



1
votes

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/ )

Il existe également une grande liste d'observations d'alternatives disponibles ici:


0 commentaires