Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Декораторы функций в 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

Во время работы за компьютером нет ни одной минутки для просмотра по ТВ своей любимой передачи. Но, проблему легко решить, свои любимые радиоспектакли слушать онлайн теперь не составит труда.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru yandex.ru
Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)