Назначение символов @ в Python? - PullRequest
13 голосов
/ 02 июня 2009

Я заметил, что в нескольких примерах я вижу такие вещи:

# Comments explaining code i think
@innerclass

или

def foo():
"""
 Basic Doc String
"""
@classmethod

Гугл не дает мне очень далеко, только для общего определения, что это такое. Также я не могу найти что-либо действительно в документации по Python.

Что они делают?

Ответы [ 4 ]

23 голосов
/ 02 июня 2009

Их называют декораторами. Это функции, применяемые к другим функциям. Вот копия моего ответа на похожий вопрос.

Декораторы Python добавляют дополнительную функциональность к другой функции. Декоратор курсивом может выглядеть как

def makeitalic(fn):
    def newFunc():
        return "<i>" + fn() + "</i>"
    return newFunc

Обратите внимание, что функция определена внутри функции. Что он в основном делает, так это заменяет функцию на новую. Например, у меня есть этот класс

class foo:
    def bar(self):
        print "hi"
    def foobar(self):
        print "hi again"

Теперь скажите, я хочу, чтобы обе функции печатали "---" после и до того, как они будут выполнены. Я мог бы добавить печать "---" до и после каждого оператора печати. Но поскольку я не люблю повторяться, я сделаю декоратор

def addDashes(fn): # notice it takes a function as an argument
    def newFunction(self): # define a new function
        print "---"
        fn(self) # call the original function
        print "---"
    return newFunction
    # Return the newly defined function - it will "replace" the original

Так что теперь я могу изменить свой класс на

class foo:
    @addDashes
    def bar(self):
        print "hi"

    @addDashes
    def foobar(self):
        print "hi again"

Для получения дополнительной информации о декораторах, проверьте http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

11 голосов
/ 02 июня 2009

Они декораторы.

<shameless plug> У меня есть сообщение в блоге на эту тему. </shameless plug>

4 голосов
/ 02 июня 2009

С

@function
def f():
    pass

Вы просто оборачиваете function вокруг f(). function называется декоратором.

Это просто синтаксический сахар для следующего:

def f():
    pass
f=function(f)
1 голос
/ 02 июня 2009

это синтаксис decorator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...