¿Cuál es la diferencia entre "decoradores Python" y el "patrón decorador"?¿Cuál es la diferencia entre los decoradores de Python y el patrón de decorador?
¿Cuándo debería usar los decoradores de Python, y cuándo debería usar el patrón de decorador?
Estoy buscando ejemplos de decoradores Python y el patrón decorador logrando lo mismo?
@AcceptedAnswer
sé que Jakob Bowyer's answer es válido. Sin embargo, la respuesta de Strikar es la que me hizo comprender por qué.
Después de la respuesta de Srikar y estudiando los recursos que he dado, he escrito este ejemplo, para poder visualizar y comprender los decoradores de Python y el patrón decorador.
debo no están de acuerdo con de Strikar "decoradores Python no son una implementación del patrón decorador". Después de lo que he aprendido Estoy muy convencido de que los decoradores de Python son la implementación del Patrón Decorador. Simplemente no de la manera clásica.
también, tengo que añadir que a pesar del hecho de que Strikar dijo "decoradores pitón añaden funcionalidad a las funciones y los métodos en tiempo de definición" puede utilizar simplemente decoradores Pytohon en tiempo de ejecución.
Aún así, sigo marcando la respuesta de Stiker como aceptada, porque me ayudó a entender Implementationde Decorator Pattern en Python.
"""
Testing Python decorators against Decorator Pattern
"""
def function(string):
return string
def decorator(wrapped):
def wrap(string):
# assume that this is something useful
return wrapped(string.upper())
return wrap
def method_decorator(wrapped):
def wrap(instance, string):
# assume that this is something useful
return wrapped(instance, string.upper())
return wrap
@decorator
def decorated_function(string):
print('! '.join(string.split(' ')))
class Class(object):
def __init__(self):
pass
def something_useful(self, string):
return string
class Decorator(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def something_useful(self, string):
string = '! '.join(string.split(' '))
return self.wrapped().something_useful(string)
@method_decorator
def decorated_and_useful(self,string):
return self.something_useful(string)
if __name__ == '__main__':
string = 'Lorem ipsum dolor sit amet.'
print(function(string)) # plain functioon
print(decorator(function)(string)) # Python decorator at run time
print(decorated_function(string)) # Python decorator at definition time
a = Class()
print(a.something_useful(string)) # plain method
b = Decorator(Class)
print(b.something_useful(string)) # Decorator Pattern
print(b.decorated_and_useful(string)) # Python decorator decorated Decorator Pattern
@Srikar es correcto. [Aquí] (http://stackoverflow.com/q/3118929/146792) ¡hay otra pregunta ASÍ que te puede resultar interesante! – mac
@Srikar, no puedo aceptar que Snswer no resuelva el problema descrito en la Pregunta, lo siento, pero la mayoría de las soluciones propuestas en mis preguntas no funcionan. – seler
@seler es suficiente. –