Python 用装饰器调用函数
我开始学习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
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
。