一、关于@的初步使用
1. 实例代码
def f1(arg):
print("f1")
rl = arg()
print(rl)
return rl + "f1"
@f1
def f2(arg=""):
print("f2")
return arg + "f2r"
print("start")
print(f2)
# print(f2("1"))
# print(f1(None))
2. 输出
f1
f2
f2r
start
f2rf1
3. 说明
在执行前,先对@进行解析所以会在start之前输出f1、f2、f2r
print(f2):实际执行的是f1(f2)
后面两个函数会报错。
print(f2("1"))报错:因为通过@已经将f2转化为字符串,无法传入字符串参数
TypeError: 'str' object is not callable
print(f1(None))报错:因为在调用传入arg参数的fun时,None不能callable
TypeError: 'NoneType' object is not callable
二、class中使用@
1. 实例代码
class myDecorator(object):
def __init__(self, f):
print ("inside myDecorator.__init__()")
self.f = f
def __call__(self):
print ("inside myDecorator.__call__()")
self.f()
@myDecorator
def aFunction():
print ("inside aFunction()")
print ("Finished decorating aFunction()")
aFunction()
2. 输出
inside myDecorator.__init__()
Finished decorating aFunction()
inside myDecorator.__call__()
inside aFunction()
3. 说明
将 aFunction 函数做为myDecorator类的参数传入
在函数定义时,创建myDecorator的实例
三、fun中使用@
1. 实例代码
def entryExit(f):
def new_f():
print ("Entering", f.__name__)
f()
print ("Exited", f.__name__)
return new_f
@entryExit
def func1():
print ("inside func1()")
func1()
2. 输出
Entering func1
inside func1()
Exited func1
3.说明
将func1做为参数掺入到entryExit函数中
在调用func1时,实际是调用的entryExit(func1)