Разбиране на декораторите в Python
Декораторите са модел на проектиране, който ви позволява да модифицирате или разширите поведението на обект, без да променяте оригиналната реализация на обекта. С други думи, декораторите ви позволяват да добавите нова функционалност към съществуващ обект, без да модифицирате основния му код.
Декораторът обикновено е функция, която приема обект като аргумент и връща нов обект, който "обвива" оригиналния обект. Новият обект има същите методи и атрибути като оригиналния обект, но също така има някои допълнителни функции или поведение, които се предоставят от декоратора.
Например, да кажем, че имате клас, наречен `Car`, който има метод, наречен `drive ()`, което кара колата да се движи. Можете да създадете декоратор, наречен „SpeedLimitDecorator“, който променя метода „drive()“, за да ограничи скоростта на автомобила. `SpeedLimitDecorator` ще вземе оригиналния обект `Car` като аргумент и ще върне нов обект `Car`, който има същите методи и атрибути като оригиналния `Car`, но с добавена функционалност за ограничаване на скоростта.
Ето един пример за това как можете да използвате декоратор в Python:
```
class Car:
def drive(self):
print("Колата се движи")
class SpeedLimitDecorator:
def __init__(self, car):
self. car = car
def drive(self):
self.car.drive()
print("Колата вече е ограничена до 50 mph")
car = Car()
speed_limited_car = SpeedLimitDecorator(car)
speed_limited_car.drive() # отпечатва „Колата се движи“ и „Колата вече е ограничена до 50 mph“
```
В този пример класът `SpeedLimitDecorator` приема обект `Car` като аргумент в своя конструктор и след това променя `drive( )` метод на оригиналния обект `Car` за ограничаване на скоростта му. Класът `SpeedLimitDecorator` също има свой собствен метод `drive()`, който извиква оригиналния метод `drive()` на обвития обект, но с добавеното ограничение от 50 mph.
Decorators са мощен инструмент за модифициране или разширяване на съществуващи обекти без да се променя първоначалното им изпълнение. Те могат да се използват за добавяне на нова функционалност, промяна на поведението или дори замяна на части от имплементацията на обект, без да се засяга останалата част от кода.



