java - similitud - que tal es python
¿Es un decorador de Python lo mismo que la anotación de Java o Java con los aspectos? (3)
¿Son los decoradores de Python iguales o similares, o fundamentalmente diferentes a las anotaciones de Java o algo así como Spring AOP o Aspect J?
Esta es una pregunta muy válida que cualquiera que incursione en estos dos idiomas simultáneamente puede obtener. He pasado un tiempo en Python, y recientemente me he puesto al día con Java y esta es mi opinión sobre esta comparación.
Las anotaciones Java son solo eso: anotaciones. Ellos son marcadores contenedores de metadatos adicionales sobre el objeto subyacente que están marcando / anotando. Su mera presencia no cambia el flujo de ejecución del subyacente, o no agrega encapsulamiento / envoltura de algún tipo sobre el subyacente. Entonces, ¿cómo ayudan? Son leídos y procesados por - Procesadores de anotación. Los metadatos que contienen pueden ser utilizados por los procesadores de anotación escritos a medida para agregar alguna funcionalidad auxiliar que hace la vida más fácil; PERO, y de nuevo, NI alteran el flujo de ejecución de un subyacente, NI se envuelven alrededor de ellos.
El énfasis en "no alterar el flujo de ejecución" será claro para alguien que haya usado decoradores de pitón. Los decoradores de Python, aunque son similares a las anotaciones de Java en apariencia, son bastante diferentes bajo el capó. Toman el subyacente y se envuelven alrededor de él de cualquier manera, como lo desee el usuario, posiblemente incluso evitando por completo ejecutar el subyacente también, si uno elige hacerlo. Toman el subyacente, se envuelven alrededor de él y reemplazan el subyacente con los envueltos. ¡Están efectivamente ''transmitiendo'' el subyacente!
¡Ahora eso es bastante similar a cómo funcionan los Aspectos en Java! Los aspectos per se están bastante evolucionados en términos de su mecanismo y flexibilidad. Pero, en esencia, lo que hacen es tomar el método ''recomendado'' (estoy hablando en la nomenclatura AOP de primavera, y no estoy seguro de si se aplica también a AspectJ), ajustar la funcionalidad a ellos, junto con los predicados y los gustos, y '' proxy ''el'' método ''recomendado'' con el envuelto.
Tenga en cuenta que estas reflexiones son muy abstractas y conceptuales, para ayudar a obtener una visión general. A medida que comienzas a profundizar, todos estos conceptos (decoradores, anotaciones, aspectos) tienen un alcance bastante amplio. Pero en un nivel abstracto, son muy comparables.
TLDR
En términos de apariencia, los decoradores de python se pueden considerar similares a las anotaciones de Java, pero bajo el capó, funcionan de manera muy similar a la forma en que funcionan los aspectos en Java.
Los decoradores de Python son solo azúcar sintáctico para pasar una función a otra función y reemplazar la primera función con el resultado:
@decorator
def function():
pass
es azúcar sintáctico para
def function():
pass
function = decorator(function)
Las anotaciones Java solo almacenan metadatos, debe tener algo que los inspeccione para agregar comportamiento.
Los sistemas Java AOP son cosas enormes construidas sobre Java, los decoradores son solo sintaxis de lenguaje con poca o ninguna semántica adjunta, realmente no se pueden comparar.
Los uso de forma similar: para activar / desactivar las opciones de depuración o prueba.
Por ejemplo (decoradores de 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):
...
Para las anotaciones de Java, use getAnnotation, etc. puede hacer trabajos similares o más complicados.