Python 用装饰器调用函数

Python 用装饰器调用函数,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我开始学习python中的装饰器。我有以下疑问吗 def add(a): print 'This is an addition function' return a @add def dollar(): print 'Am i getting the concept ?' dollar() 此调用将输出作为 This is an addition function Am i getting the concept ? 但是如果我像这样调用函数,我会得到下面的错误 def a

我开始学习python中的装饰器。我有以下疑问吗

def add(a):
  print 'This is an addition function'
  return a


@add
def dollar():
  print 'Am i getting the concept ?'

dollar()
此调用将输出作为

This is an addition function
Am i getting the concept ?
但是如果我像这样调用函数,我会得到下面的错误

def add(a):
  a
  print 'This is an addition function'



@add
def dollar():
  print 'Am i getting the concept ?'

dollar()


 This is an addition function
 Traceback (most recent call last):
 File "D:\Python Programs\Sample\src\TestRuns.py", line 10, in <module>
 dollar()
 TypeError: 'NoneType' object is not callable
def添加(a):
A.
打印“这是一个加法函数”
@加
定义美元():
打印“我明白这个概念了吗?”
美元()
这是一个加法函数
回溯(最近一次呼叫最后一次):
文件“D:\Python Programs\Sample\src\TestRuns.py”,第10行,在
美元()
TypeError:“非类型”对象不可调用

我的查询是当我们调用带有参数a的函数以返回其工作时。但是,当我们单独地将论点称为论点时,它不起作用吗

装饰程序必须返回第二个版本中没有的可调用/函数

@add
def dollar():
    print 'Am i getting the concept ?'
缩写为:

def dollar():
    print 'Am i getting the concept ?'
dollar = add(dollar) 
因此:

def add(a):
   a  # this line doesn't do anything!
   print 'This is an addition function'  
   # this line is executed upon decoration

@add  # prints 'This is an addition function'
def dollar():
    print 'Am i getting the concept ?'
# BUT: dollar is now None, since add didn't return anything
# SO:

dollar()

# fails
你写第一个版本的装饰器的方式表明你并没有真正得到这个概念。通常,人们装饰该函数是为了操纵该函数的行为。您的第一个装饰师根本不会改变
美元
!附加的
打印
仅在装饰时发生一次,而不是在调用装饰函数时:

dollar()
dollar()
dollar()

# Output
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
Am i getting the concept ?    # dollar execution
Am i getting the concept ?    # dollar execution
如果您希望装饰程序在装饰函数的每个调用中添加额外的输出行,您应该执行以下操作:

def add(a):
    def dec_a():
        print 'This is an addition function'
        a()
    return dec_a  # return the augmented function

# Output
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution

装饰器必须返回第二个版本中没有的可调用/函数

@add
def dollar():
    print 'Am i getting the concept ?'
缩写为:

def dollar():
    print 'Am i getting the concept ?'
dollar = add(dollar) 
因此:

def add(a):
   a  # this line doesn't do anything!
   print 'This is an addition function'  
   # this line is executed upon decoration

@add  # prints 'This is an addition function'
def dollar():
    print 'Am i getting the concept ?'
# BUT: dollar is now None, since add didn't return anything
# SO:

dollar()

# fails
你写第一版装饰师的方式表明你并没有真正理解这个概念。通常,人们装饰该函数是为了操纵该函数的行为。您的第一个装饰师根本不会改变
美元
!附加的
打印
仅在装饰时发生一次,而不是在调用装饰函数时:

dollar()
dollar()
dollar()

# Output
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
Am i getting the concept ?    # dollar execution
Am i getting the concept ?    # dollar execution
如果您希望装饰程序在装饰函数的每个调用中添加额外的输出行,您应该执行以下操作:

def add(a):
    def dec_a():
        print 'This is an addition function'
        a()
    return dec_a  # return the augmented function

# Output
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution
This is an addition function  # decoration 
Am i getting the concept ?    # dollar execution

Decorator是在执行其他方法之前对该方法进行操作的方法。因此,它必须在decorator函数的末尾返回和function对象。删除return语句将返回None,而阻止执行dollar方法

Decorator是一种在执行该方法之前对其他方法进行操作的方法。因此,它必须在decorator函数的末尾返回和function对象。删除return语句将返回None,并阻止执行dollar方法

ok我的查询是带有return a的,它在工作,为什么当我们只调用a时它不工作?i、 e如果我们调用a(),那么为什么不返回a()?如果返回a起作用,为什么不简单地说a?
a
既不返回
a
也不调用
a
,它什么也不做!如果在decorator中编写
a()
,则修饰函数将在声明/修饰时执行一次,但仍然不是可调用函数。如果您的装饰器返回
a()
,函数将在装饰时执行,其返回值(None)将返回并分配给class属性
dollar
。好的,我的查询是返回一个它工作的函数,当我们只调用a时,为什么它不工作?i、 e如果我们调用a(),那么为什么不返回a()?如果返回a起作用,为什么不简单地说a?
a
既不返回
a
也不调用
a
,它什么也不做!如果在decorator中编写
a()
,则修饰函数将在声明/修饰时执行一次,但仍然不是可调用函数。如果装饰器返回
a()
,则函数将在装饰时执行,其返回值(无)将返回并分配给类属性
dollar