【问题标题】:Purpose of @ symbols in Python?Python中@符号的用途?
【发布时间】:2009-06-02 13:13:22
【问题描述】:

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

# Comments explaining code i think
@innerclass

或:

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

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

这些有什么作用?

【问题讨论】:

  • @uberjumper - 如果你觉得我们都值得,你应该给 abhinavg 答案。我的博客获得了一些免费流量,但无论如何他们的代表都比我少。

标签: python


【解决方案1】:

它们被称为装饰器。它们是应用于其他功能的功能。这是我对类似问题的回答的副本。

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

【讨论】:

  • 仅供参考 - 另一个答案在这里:stackoverflow.com/questions/739654/…
  • 如果你不使用'fn'参数,为什么还要添加Dashes呢?
  • 我使用 pythontutor.com/visualize.html 来真正了解这里发生了什么。所有的 'self' 都让人很困惑,主要是 newFunction(self) 和 fn(self)。
【解决方案2】:

他们是装饰者。

&lt;shameless plug&gt; 我有一个关于这个主题的blog post&lt;/shameless plug&gt;

【讨论】:

  • 你的无耻插件,写得非常好,清晰。
【解决方案3】:

@function
def f():
    pass

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

它只是以下的语法糖:

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

【讨论】:

    【解决方案4】:

    这是一个decorator 语法。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2011-04-03
      • 2010-11-05
      • 2011-03-28
      • 2015-10-23
      • 2013-03-10
      相关资源
      最近更新 更多