


Compreendendo decoradores em Python
Decoradores são um padrão de design que permite modificar ou estender o comportamento de um objeto sem alterar a implementação original do objeto. Em outras palavras, os decoradores permitem adicionar novas funcionalidades a um objeto existente sem modificar seu código principal.
Um decorador é normalmente uma função que recebe um objeto como argumento e retorna um novo objeto que "envolve" o objeto original. O novo objeto possui os mesmos métodos e atributos do objeto original, mas também possui algumas funcionalidades ou comportamentos adicionais fornecidos pelo decorador.
Por exemplo, digamos que você tenha uma classe chamada `Car` que possui um método chamado `drive ()` que faz o carro se mover. Você poderia criar um decorador chamado `SpeedLimitDecorator` que modifica o método `drive()` para limitar a velocidade do carro. O `SpeedLimitDecorator` pegaria o objeto `Car` original como argumento e retornaria um novo objeto `Car` que possui os mesmos métodos e atributos do `Car` original, mas com a funcionalidade adicional de limitar a velocidade. exemplo de como você pode usar um decorador em Python:
```
class Car:
def drive(self):
print("O carro está dirigindo")
class SpeedLimitDecorator:
def __init__(self, car):
self. carro = car
def drive(self):
self.car.drive()
print("O carro agora está limitado a 50 mph")
car = Car()
speed_limited_car = SpeedLimitDecorator(car)
speed_limited_car.drive() # imprime "O carro está dirigindo" e "O carro agora está limitado a 50 mph"
```
Neste exemplo, a classe `SpeedLimitDecorator` pega um objeto `Car` como argumento em seu construtor e então modifica o `drive( )` do objeto `Car` original para limitar sua velocidade. A classe `SpeedLimitDecorator` também tem seu próprio método `drive()` que chama o método `drive()` original do objeto empacotado, mas com a limitação adicional de 50 mph.
Decorators são uma ferramenta poderosa para modificar ou estender objetos existentes sem alterar sua implementação original. Eles podem ser usados para adicionar novas funcionalidades, modificar comportamento ou até mesmo substituir partes da implementação de um objeto sem afetar o restante do código.



