Un décorateur Python est-il identique à une annotation Java ou à Java avec Aspects?




python-decorators java-annotations (2)

Les décorateurs Python sont-ils identiques ou similaires, ou fondamentalement différents des annotations Java ou de quelque chose comme Spring AOP ou Aspect J?


C’est une question très valable que toute personne qui manipule simultanément ces deux langues peut se poser. J'ai moi-même passé un peu de temps sur Python et je me suis récemment familiarisé avec Java. Voici mon point de vue sur cette comparaison.

Les annotations Java ne sont que des annotations. Ce sont des marqueurs; des conteneurs de métadonnées supplémentaires sur l'objet sous-jacent qu'ils marquent / annotent. Leur simple présence ne modifie pas le flux d’exécution du sous-jacent, ni n’ajoute d’encapsulation / encapsuleur au-dessus du sous-jacent. Alors, comment aident-ils? Ils sont lus et traités par - des processeurs d'annotation. Les métadonnées qu'elles contiennent peuvent être utilisées par les processeurs d'annotation personnalisés pour ajouter des fonctionnalités auxiliaires facilitant la vie. MAIS, et encore, ils NE modifient PAS le flux d’exécution d’un sous-jacent, ni s’enroulent autour d’eux.

Pour qui a utilisé des décorateurs en python, l'accent sera mis sur "ne pas modifier le flux d'exécution". Les décorateurs en Python, bien que similaires aux annotations Java, sont très différents sous le capot. Ils prennent le sous-jacent et s’enroulent autour de lui de quelque manière que ce soit, selon les souhaits de l'utilisateur, évitant même peut-être même complètement d'exécuter le sous-jacent lui-même, si on le souhaite. Ils prennent le sous-jacent, s’enroulent autour de lui et remplacent le sous-jacent par ceux qui sont enveloppés. Ils sont effectivement "proxy" le sous-jacent!

Voilà qui est assez similaire à la façon dont Aspects fonctionne en Java! Les aspects en soi sont assez évolués en termes de mécanisme et de flexibilité. Mais, en gros, ils agissent comme suit: utilisez la méthode "conseillée" (je parle dans la nomenclature AOP du printemps, et ne savez pas si elle s'applique également à AspectJ), enveloppez-la de fonctionnalités, ainsi que des prédicats et autres, et ' proxy 'la méthode' conseillé 'avec celle enveloppée.

Veuillez noter que ces réflexions sont à un niveau très abstrait et conceptuel, pour vous aider à obtenir une vue d’ensemble. Au fur et à mesure que vous approfondissez, tous ces concepts - décorateurs, annotations, aspects - ont une portée assez complexe. Mais à un niveau abstrait, ils sont très comparables.

TLDR

En termes d’apparence, les décorateurs en python peuvent être considérés comme similaires aux annotations Java, mais sous le capot, ils fonctionnent de manière très similaire à la manière dont Aspects fonctionne en Java.


J'utilise les deux de la même manière: activer / désactiver les options de débogage ou de test.

Par exemple (décorateurs Python):

def measure_time(func):
    def _measure_time(*args, **kwargs):
        t0 = time.time()
        ret = func(*args, **kwargs)
        print "time=%lf" % (time.time()-t0)
        ...
        return ret
    return _measure_time


@measure_time
def train_model(self):
    ...

Pour les annotations Java, utilisez getAnnotation, etc. peut effectuer des tâches similaires ou plus complexes.





java-annotations