Python中@符号的用途?

时间:2009-06-02 13:13:23

标签: python

我在几个例子中注意到我看到了这样的事情:

# Comments explaining code i think
@innerclass

或:

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

谷歌搜索并没有让我走得太远,只是对这是什么的一般定义。我也无法在python文档中找到任何内容。

这些是做什么的?

4 个答案:

答案 0 :(得分:23)

他们被称为装饰者。它们是应用于其他功能的功能。以下是我对类似问题的回答。

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"

现在说,我希望两个函数在完成之后和之前打印“---”。我可以在每个print语句之前和之后添加一个打印“---”。但因为我不喜欢重复自己,我会做一个装饰师

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

答案 1 :(得分:11)

他们是装饰者。

<shameless plug> 我对这个问题有一个blog post</shameless plug>

答案 2 :(得分:4)

@function
def f():
    pass

您只需将function包裹在f()周围。 function被称为装饰者。

以下是语法糖:

def f():
    pass
f=function(f)

答案 3 :(得分:1)

它是decorator语法。