Laissez-moi commencer par dire ce que je voudrais faire. Je veux créer un wrapper paresseux pour une variable, comme dans I enregistrer tous les appels de méthode et les opérateurs et les évaluer plus tard quand je spécifie la variable pour l'appeler. En tant que tel, je veux être en mesure d'intercepter tous les appels de méthode et les appels opérateur et les méthodes spéciales afin que je puisse travailler dessus. Cependant, __getattr__
n'intercepte pas les appels d'opérateur ou __str__
et ainsi de suite, donc je veux savoir s'il y a une manière générique de surcharger tous les appels de méthode, ou devrais-je créer dynamiquement une classe et dupliquer le code pour tout cela (que je déjà fait, mais est moche).Python interception méthode appel
Répondre
Cela peut être fait, mais oui, il devient "moche" - j'ai écrit une fois un décorateur paresseux, qui transforme n'importe quelle fonction en une "fonction paresseusement calculée".
Fondamentalement, j'ai découvert que le seul moment où la valeur d'un objet est réellement utilisée dans Python est quand l'une des méthodes spéciales "dunder" est appelée. Par exemple, lorsque vous avez un nombre, sa valeur n'est utilisée que lorsque vous l'utilisez dans une autre opération ou la convertissez en chaîne pour IO (qui utilise également une méthode "dunder")
Alors, mon wrapper anote les paramètres à un appel de fonction et renvoie un objet spécial, qui a potentiellement toutes les méthodes "dunder". Juste au moment où l'une de ces méthodes est appelée, la fonction d'origine est appelée - et sa valeur de retour est ensuite mise en cache pour une utilisation ultérieure.
La mise en œuvre est ici: https://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py
Désolé pour le texte et la plupart de la présentation étant en portugais.
Vous avez raison, '__getattribute__' n'est pas appelé sur les méthodes dunder. –
- 1. appel automatique/interception d'appel
- 2. iPhone sdk appel interception
- 3. Interception de méthode Ruby
- 4. Appel méthode d'attribut python
- 5. Interception d'une méthode avec réflexion
- 6. Interception find_by_attribute méthode enregistrement actif
- 7. Odoo méthode python appel QWEB
- 8. Interception d'un appel jQuery.ajax() avec confirmation()
- 9. Python - Cant appel/sauter une méthode
- 10. Appel d'une méthode Python par son nom
- 11. appel d'une méthode de classe en python
- 12. interception d'une socket rompue en python
- 13. Interception onOptionsItemSelected
- 14. interception d'appel sur Android
- 15. Interception dynamique d'appels dans .NET
- 16. Interception Tkinter Commande "Exit"?
- 17. jquery interception
- 18. Interception d'asp.net ajax webmethod
- 19. Interception de méthode d'exécution de poste de Guice
- 20. Interception des appels de méthode au moniteur de référence?
- 21. Unity Interception GetCustomAttribute
- 22. Appel d'une autre méthode de classes en Python
- 23. Appel de la méthode d'un autre processus en Python
- 24. Appel de méthode de classe de base Python: comportement inattendu
- 25. Appel d'une méthode en Python de manière plus efficace
- 26. API Telegram.org: appel de la méthode invokeWithLayer en Python
- 27. Héritage et méthode de classe de base appel python
- 28. Appel de la méthode python via java ProcessBuilder()
- 29. UINavigationController interception - popViewControllerAnimated:
- 30. Interception tactile AdWhirl
J'ai écrit une réponse à [cette question] (http://stackoverflow.com/questions/9057669/how-can-i-intercept-calls-to-pythons-magic-methods-in-new-style-classes/9059858 # 9059858) qui est similaire à ce que vous voulez faire. – kindall
Même __getattribute__ n'est pas appelé sur les méthodes dunder. Drat. –