Декораторы функций в Python
Общие вопросы python функции, декораторы python, декораторы в python, декораторы функций
Декораторы функций - обеспечивают способ определять специальные режимы работы для функции, обертывая их дополнительным слоем логики, реализованной в виде других функций.
class A: @staticmethod # декоратор в Python для создания статических методов def summ(x,y): return x+y a = A.summ(6,7) print a # 13
class B: # альтернативная реализация класса А def summ(x,y): return x+y summ = staticmethod(summ) b = B.summ(6,7) print b # 13
class Counter: # класс как декоратор def __init__(self, func): # принимаем в качестве параметра декорируемую функцию self.func = func # запоминаем декорируемую функцию self.calls = 0 def __call__(self, *args): # вызов декоратора, *args - аргументы декорируемой функции self.calls += 1 if self.calls >= 3: print "function summ call %s" % (self.calls,) # если функция summ была запущена 3 или больше раз return self.func(*args) @Counter def summ(a,b,c): return a+b+c print summ(5,9,2) print summ(1,7,2) print summ(4,9,3) # 16 # 10 # function summ call 3 # 16
# функция декорирующая другую функцию def mydecorator(func): # функция принимающая декорируемую функцию def wrapper(*args): # функция запускаемая при вызове декоратора и принимающая аргументы декорируемой функции result = 1 for x in args: # цикл для подсчета произведения чисел декорируемой функции result*=x print "multiply = %s" % result return func(*args) # запуск декорируемой функции return wrapper @mydecorator def summ(a,b,c): return a+b+c print summ(5,9,3) # multiply = 135 # 17
В Python существует возможность передачи параметров самому декоратору, но для этого придется создать еще один слой обертывания.
# decorator def is_man(is_man=False): def decorator(view): def wrapper(*args, **kwargs): print 'I man - ', is_man return view(*args, **kwargs) return wrapper return decorator @is_man(True) def my(): pass my() # I man - True
Декораторы выполняются в порядке от внешнего к внутреннему. Последовательность выполнения в физическом мире напоминает разворачивание подарочной упаковки, слой за слоем...точно в такой последовательности выполняются декораторы.
# Последовательность выполнения соответствует числовому индексу
@decorator1 @decorator2 def main(): pass
Во время работы за компьютером нет ни одной минутки для просмотра по ТВ своей любимой передачи. Но, проблему легко решить, свои любимые радиоспектакли слушать онлайн теперь не составит труда.
- Вулкан официальный сайт - возможность заработать играя
- Главные показатели качественного контента
- Модуль shelve в Python - сохранение объектов в файл
- Способы создания своего сайта
- Форум вебмастеров и SEO оптимизаторов
- Романтизм и волшебство игрового автомата Lucky Lady Charm
- Почему программисты используют Python?