![]() |
Quelques explications sur le module aspects |
Quelques explications sur le module aspects1. Les principales parties
2. Comment définir un point d'arrêtLorsque vous souhaitez tisser un aspect sur une classe entière, ou sur un module entier, vous pouvez directement utiliser les méthode weave_methods ou weave_module. Mais lorsque vous souhaitez tisser un aspect seulement sur une partie de la classe (c.a.d pas sur l'ensemble de ses méthodes), alors vous devrez créer une instance de classe PointCut, puis appeler la méthode weave_pointcut. Un point d'arrêt, dans ce paquet, est tout simplement un dictionnaire avec pour clés, des instances ou des classes, et pour valeurs, des listes de méthodes sur lesquelles vous souhaitez appliquer l'aspect. La classe PointCut dérivant du type dictionnaire , il est possible de définir directement ses clés et ses valeurs, mais il est cependant conseillé d'utiliser les méthodes existantes :
Quand l'objet est créé, pour tisser l'aspect, il suffit de faire :
weaver.weave_pointcut(pointcut, aspect_class)
3. Un exemple d'utilisation(Extrait de logger_example.py) :
# On importe le tisseur et l'aspect qu'on souhaite utiliser
from logilab.aspects.weaver import weaver
from logilab.aspects.lib.logger import LoggerApsect
import sys
stack = StackImpl()
# Ajoutons un élément à la pile, l'appel n'est pas tracé
stack.push("an element")
# on applique l'aspect (on spécifie que le traçage se fera
# sur la sortie standard d'erreur)
weaver.weave_methods(stack, LoggerAspect, sys.stderr)
# Rajoutons un autre élément. Maintenant, l'appel sera tracé
stack.push("another element")
# On enlève l'aspect Logger
weaver.unweave(stack, LoggerAspect)
# Maintenant, les appels ne sont plus tracés
stack.push("a third element")
Dans cette exemple, on a appliqué un aspect un une instance donnée. Par conséquent, les autres instances de la même classe ne seront pas aspectées. Si on avait voulu faire en sorte que toutes les instances d'une classe soient aspectées, il aurait alors fallu tisser l'aspect non pas sur l'instance, mais directement sur la classe. La syntaxe est la même
weaver.weave_methods(StackImpl, LoggerAspect, sys.stderr)
4. Comment créer son aspect:Pour l'instant, il n'est possible de définir que ce qui va être exécuté avant et après des appels de méthodes. Il sera rapidement possible de définir le même genre de comportement pour la modification d'attributs. Pour créer un nouvel aspect, il faut créer une classe qui hérite de AbstractAspect (dans aspects.core), et définir les méthodes before() et after() et around(). Il est tout à fait possible de ne surcharger qu'une seule de ces trois méthodes pusique le comportement par défaut est simplement de passer. Il est important, lorsque l'on surcharge la méthode around de faire appel dedans à la méthode self._proceed qui correspond à l'appel de la méthode wrappée. Ecrivons un aspect simple qui ne fait que écrire BEFORE avant que la méthode ne soit effectivement appelée et AFTER après.
from logilab.aspects.core import AbstractAspect
class SimpleAspect(AbstractAspect):
def before(self, wobj, context, *args, **kwargs):
"""Before method
"""
print "BEFORE ",context['method_name']
def after(self, wobj, context, *args, **kwargs):
"""After method.
print the return value
"""
print "AFTER ",self.method_name,", return value is ", context['ret_v']
Cet exemple est très simple et n'a pas vraiment d'utilité, mais il permet de voir comment doit être créé un aspect. Quelques précisions sur le code ci-dessus:
IMPORTANT : le tisseur (classe Weaver) est un Singleton qui garde à tout moment l'ensemble des informations relatives aux méthodes tissées, c'est-à-dire quelle méthode a été tissée avec quel aspect, etc.. Lorsque l'on tisse un aspect sur une méthode, le tisseur regardera si cet aspect a déjà été tisser, et, dans ce cas, utilisera l'instance déjà existante de cet aspect. Cela va rapidement changer à cause des contraintes que cela induit. 5. Exemples des aspects fournis avec le moduleLe module aspects contient des aspects utiles comme :
6. Plus d'informations à propos de l'AOPVoici un ensemble de liens utiles pour la Programmation orientée Aspect:
7. TéléchargementLe module aspects peut être téléchargé à partir du site FTP de Logilab. Vous y trouverez une archive contenant les sources du module ainsi que des paquets debian. Pour l'installer à partir des sources, il suffit de taper : python setup.py install après avoir décompressé l'archive. 8. Vos commentairesN'hésitez pas à nous faire de tout commentaire, patch, ou question sur la liste de diffusion python-projects. |