542.00K
Category: programmingprogramming

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     Русский Rules