Similar presentations:
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/