Замыкание и декораторы
Разбор Д/З
Замыкание
- Функция — это объект
- Её можно изготовить внутри другой функции и вернуть
- …причём в зависимости от параметров этой другой функции!
- …в процессе чего некоторые объекты из ПИ создающей функции «залипают» в ПИ создаваемой
- только они там навсегда должны залипнуть, а не только на время вызова
⇒ .__closure__
- Это и есть замыкание! (в других языках сложнее?)
и
Also: nonlocal
Пример: def closurefun(param) vs nonclosurefun(param=param) простые примеры
Декораторы
Частный случай замыкания — изготовление обёртки над функцией, т. е. конструктор функции
1 def Debug(fun):
2 def newfun(*argp, **argn):
3 print("###", argp, argn)
4 return fun(*argp, **argn)
5 return newfun
6
7 @Debug # Включить отладку
8 def funct(a,b,c=0):
9 return a+b*c
10
11 a = funct(2,3,4)
12 # Dfunct = Debug(funct) # Отладка вручную без @Debug
13 # a = Dfunct(3,4,5) # Отладка вручную
14 # или
15 # a = Debug(funct)(3,4,5) # Отладка вручную
16 print(a)
Параметрические декораторы (конструкторы декораторов!)
вместо объекта-функции мы пишем вызов этого объекта, значит, возвращать он должен функцию!
Декораторы методов, в частности: property, classmethod, staticmethod`
вторая часть статьи (+декораторы методов)
Д/З
TODO