python - python 中的装饰器 - 需要解释

标签 python decorator

我是Python新手,无法理解装饰器的概念。我正在尝试实现两个装饰器,一个是 nonNegative,它假定任意长的整数参数列表,如果有小于 0 的值,则抛出异常;另一个是 allCaps,它假定任意长的字符串参数列表,并将它们大写。然后,编写一个简单的函数来测试每个函数,包装它,并演示每个装饰器的工作原理。

我已经开始并走到了这一步。

#!/usr/local/bin/python2.7

def NonNegative(inputs):
  for i in inputs:
    if i<0:
      raise exception

def allCaps(inputs2):
  for i in inputs2:
    a = i.upper()
    print a

def inputs
def inputs2():
  inputfile = open ("input.txt")
  sentence = inputfile.readlines()
  words = (sentence[0].split())
  return words

NonNegative(inputs)

如果有人能向我解释装饰器的概念,我将不胜感激。我试图理解它,但无法理解。

最佳答案

将装饰器视为包装函数的函数。

在数学中,您可能有一个函数f(x)。如果你用装饰器 g 包装它,你就会有 g(f(x))

在Python中的表示是

@function_g
def function_f():
    pass

这是一个例子:

def entryExit(f):
    def new_f():
        print "Entering", f.__name__
        f()
        print "Exited", f.__name__
    return new_f

@entryExit
def func1():
    print "inside func1()"

您会看到我们定义了一个函数extryExit,它返回一个包装函数(因此将函数作为其输入)。它将这个函数包装在 new_f 中。

通过用装饰器包装函数,func1 转换为

def func1():
    print "inside func1()"

def func1(f):
    print "Entering", f.__name__
    print "inside func1()"
    print "Exited", f.__name__

您还可以编写一个类来定义装饰器,但我认为函数装饰器不太冗长。

您可以使用 this excellent intro here. 阅读有关装饰器的更多信息。

关于python - python 中的装饰器 - 需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337553/

相关文章:

python - 何时更新 mongo 数据库索引

python - 无法使用装饰器处理具有不同分页的两个链接

rust - 返回实现多个特征的对象——装饰器模式

python - 测试 Python 装饰器?

java - 如何从对象中删除装饰器?

php - 我可以重用装饰器吗?

Python函数装饰器错误

Python EXE 文件创建

python - 在 Django 服务器中运行复杂的计算(使用 python/pandas)

python - “模块”对象没有属性 'FieldStorage'