puede - qué es un decorador en python
¿Cuál es la diferencia entre los decoradores de Python y el patrón de decorador? (3)
La diferencia es esta:
(a) Los decoradores de Python están vinculados a un método existente y cambian el comportamiento de ese método. Ejemplo:
@modifyBehavior
def original(myString):
print myString
Se sobrescribe el comportamiento del original. No puedes usar esto para agregar una nueva funcionalidad.
(b) El patrón decorador se trata de polimorfismo. En su código de ejemplo anterior, se sobrescribe el comportamiento de Decorator.something_useful. El método original se pierde. No es realmente un patrón decorador. Debe buscar mejorar o agregar funcionalidad, no reemplazar un método. Debe asegurarse de que a.something_useful (cadena) devuelva lo mismo que b.something_useful (cadena). De hecho, en el patrón de decorador normalmente reemplazaría el objeto original. Esto es lo que quiero decir:
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 withUnderscores(self, string):
return ''_''.join(string.split('' ''))
def __getattr__(self, name):
return getattr(self._wrapped, name)
if __name__ == ''__main__'':
string = ''Lorem ipsum dolor sit amet.''
obj = Class()
print(''Original: '', obj.something_useful(string))
#This has no underscore function. Use decorator to add.
obj = Decorator(obj)
print(''Replaced spaces: '', obj.withUnderscores(string))
print(''Original still works: '', obj.something_useful(string))
Puedes tener varios decoradores para añadir funcionalidad. Esto le permite agregar solo lo que necesita cuando lo necesita. Más lecturas: GoF
¿Cuál es la diferencia entre los "decoradores de Python" y el "patrón decorador"?
¿Cuándo debo usar decoradores de Python y cuándo debo usar el patrón de decorador?
Estoy buscando ejemplos de decoradores de Python y el patrón de decorador logrando lo mismo.
@AceptoAceptado
Sé que la respuesta de Jakob Bowyer es válida. Sin embargo, es la respuesta de Strikar la que me hizo entender por qué.
Después de la respuesta de Srikar y el estudio de los recursos dados, he escrito este ejemplo, para que pueda visualizar y comprender los decoradores de Python y el patrón de decorador.
Debo estar en desacuerdo con Strikar: " Los decoradores de Python no son una implementación del patrón de decorador ". Después de lo que he aprendido , estoy totalmente convencido de que los decoradores de Python están implementando el patrón de decorador. Simplemente no de la manera clásica.
Además , debo agregar que a pesar del hecho de que Strikar dijo que "los decoradores de Python agregan funcionalidad a las funciones y métodos en el momento de la definición ", se pueden usar fácilmente los decoradores de Python en el tiempo de ejecución .
Sin embargo, sigo marcando la respuesta de Stiker como aceptada, porque me ayudó a comprender la implementación del patrón de decoración en Python .
"""
Testing Python decorators against the 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 function
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 the decorator pattern
Los decoradores en Python son la aplicación de decoradores en el diseño de decoradores.
Ambos son lo mismo. Uno habla de la implementación del lenguaje y el otro de un concepto de diseño e informática.
Patrón decorador : en la programación orientada a objetos, el patrón decorador es un patrón de diseño que permite que el comportamiento se agregue dinámicamente a un objeto existente. El patrón decorador se puede usar para extender (decorar) la funcionalidad de un determinado objeto en tiempo de ejecución, independientemente de otros casos de la misma clase, siempre que se realicen algunos trabajos básicos en el momento del diseño.
Decoradores en Python : a pesar del nombre, los decoradores de Python no son una implementación del patrón de decorador. El patrón decorador es un patrón de diseño utilizado en lenguajes de programación orientados a objetos tipificados estáticamente para permitir que la funcionalidad se agregue a los objetos en tiempo de ejecución; Los decoradores de Python agregan funcionalidad a las funciones y métodos en el momento de la definición, y por lo tanto son una construcción de más alto nivel que las clases de patrón de decorador.
El patrón del decorador en sí mismo se puede implementar de forma trivial en Python, porque el lenguaje está escrito en pato y, por lo tanto, generalmente no se considera como tal. Entonces, en Python, un decorador es cualquier objeto Python llamable que se utiliza para modificar una función, método o definición de clase.
Espero haber dejado clara la diferencia. En caso de que no lo haya entendido completamente, por favor lea estos enlaces. Saldrás más que claro al final: