Декораторы
Функции и классы в Python – объекты удобные. Они сами могут быть входящими и исходящими аргументами функций. Это свойство можно использовать, чтобы сделать жизнь разработчика немного приятнее.
Смысл паттерна Декоратор заключается в том, что некоторая функция заворачивается в другую функцию, приобретая от нее новые возможности. Например, так можно вести логи, вводить пред- и постусловия, добавлять методы для классов.
Декораторы в Python – это, по сути, синтаксический сахар. Для их обозначения используется символ @.

Код ниже описывает обычный вариант приготовления сэндвича. Нужно взять что-нибудь мясное, обложить с двух сторон овощами и положить в булку.
def bread(func):
def wrapper():
print "</''''''\>"
func()
print "<\______/>"
return wrapper
def vegetables(func):
def wrapper():
print "#помидорка#"
func()
print "~лист салата~"
return wrapper
def sandwich(food="--ветчина--"):
print food
sandwich = bread(vegetables(sandwich))
sandwich()
#</''''''\>
# #помидорка#
# --ветчина--
# ~лист салата~
#<\______/>
Изначально функция sandwich только печатает начинку, а затем она становится полноценным бутербродом. То же самое можно сделать чуть проще:
@bread @vegetables def sandwich(food="--ветчина--"): print food sandwich()
Вместо привычного синтаксиса вызова функции, используются два декоратора, которые оборачивают исходный сэндвич. Название остается прежним, но результат работы уже другой.
В Python есть несколько встроенных декораторов, например, @classmethod, @staticmethod, @property.