540.00K
Категория: ПрограммированиеПрограммирование

Python декораторы

1.

Python
декораторы

2.

В Python всё объекты!
В Python функция является объектом, поэтому её
также можно передавать, как аргумент для другой
функции.
Декорирование

прием
программирования,
позволяющий изменять поведение функции, не
изменяя её код.
Поэтому мы можем передать одну функцию в
качестве аргумента другой. При помощи второй
функции внести изменения в результат работы первой,
при этом не изменяя её алгоритм, а только корректируя
результат.
Вторая функция называется декоратором, которая как
бы «оборачивает» работу первой своими командами.

3.

Декораторы
def Декоратор(Декорируемая_функция):
def Функция_обертка():
# команды, которые сработают
# до оригинальной функции
Декорируемая_функция
# или после неё
return Функция_обертка

4.

Декораторы
Вызов:
def Оригинальная_функция():
#Важные команды
Оригинальная_функция=Декоратор(Оригинальная_функция)
Оригинальная_функция()
Или проще:
@Декоратор
def Оригинальная_функция():
#Важные команды
Оригинальная_функция()

5.

Декораторы
def decorator(original_function): # функция-декоратор
def wrapper(): # функция обёртка
print("Я - код, который отработает до вызова функции")
original_function() # Сама функция
print("А я - код, срабатывающий после")
return wrapper
def alone_function(): # декорируемая функция
print("Я простая одинокая функция, ты ведь не посмеешь
меня изменять?")

6.

Декораторы
# переопределим функцию, используя функцию декоратор
alone_function = decorator(alone_function)
alone_function()
# или
@decorator
def alone_function(): # декорируемая функция
print("Я простая одинокая функция, ты ведь не посмеешь меня
изменять?")
Вывод:
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня
изменять?
А я - код, срабатывающий после

7.

Декораторы
def bread(func):
def wrapper():
print()
func()
print("<\______/>")
return wrapper
def ingredients(func):
def wrapper():
print("#помидоры#")
func()
print("~салат~")
return wrapper
def sandwich(food="--ветчина--"):
print(food)

8.

Декораторы
@bread
@ingredients
def sandwich(food="--ветчина--"):
print(food)
#помидоры#
--ветчина-~салат~
<\______/>
sandwich()
# -------------------------------
------------------------------#
@ingredients
@bread
def sandwich(food="--ветчина--"):
print(food)
#помидоры#
sandwich()
--ветчина-<\______/>
~салат~

9.

Статический метод
Статический метод - функция, определенная внутри
класса. Может быть как вызвана без создания
экземпляра класса, так и передана дочерним классам.
Не требует аргументов (в том числе и self).
class Имя_класса:
@staticmethod
def Функция:
….

10.

Статический метод
class Hero:
@staticmethod
def say_hello():
print("Helllo...")
class HeroSon(Hero):
pass
ajax=Hero()
ajax.say_hello() # "Helllo..."
son = HeroSon()
son.say_hello() # "Helllo..."

11.

Метод класса
Метод, первым аргументом которого является класс.
Вместо self принято называть первый аргумент cls, для
подчеркивания принадлежности метода к методам
класса. Используется, например, в фабричных методах,
определяющих создание объектов.
class Имя_класса:
@classmethod
def Метод(cls):
….

12.

Метод класса
class Hero:
@classmethod
def say_class_hello(cls):
if(cls.__name__=="HeroSon"):
print("Hi Kido")
elif(cls.__name__=="HeroDaughter"):
print("Hi Princess")
class HeroSon(Hero):
pass
class HeroDaughter(Hero):
pass
testson = HeroSon()
testson.say_class_hello() # "Hi Kido"
testdaughter = HeroDaughter()
testdaughter.say_class_hello() # "Hi Princess"

13.

Дескрипторы
Для работы с дескрипторами вместо функции
property можно использовать декоратор @property
Было:
class C:
def getx(self):
return self.__x
def setx(self, value):
self.__x = value
x = property(getx, setx)
Стало:
class C:
@property
def fun(self):
return self.__x
@fun.setter
def fun(self, value):
self.__x = value

14.

Ссылки по теме
1)https://habr.com/post/141411/
2)https://habr.com/post/141501/
English     Русский Правила