首页 > 代码库 > 装饰器四部曲

装饰器四部曲

第一步

#func()是执行函数的意思,而func是该函数的内存地址的意思

#这里还要解释下,该函数的参数是func,函数有2个语句,一个是print语句,一个是return,该return
#的返回值就是func的内存地址
def login_check(func):
print(‘passed user verification.....‘)
return func

def tv():
print(‘Welcome [%s] to TV page‘)

#这里需要解释一下,把vt这个函数的内存地址作为参数传递给login_check,而login_check有个参数func,所以这个
#func这个参数就是tv这个函数,在login_check这个函数的返回值就是tv这个函数的内存地址,下面在使用tv();来
#调用tv这个函数

tv = login_check(tv)
tv()



第二部
def login(func):
print(‘passed user verification....‘)
return func

@login #@login == tv = login(tv)
def tv(name):
print(‘welcome [%s] to tv page。。。‘ %(name))
@login #@login == move = login(move)
def move(name):
print(‘welcome [%s] to move page...‘ %(name))

#这段代码有个问题就是,用@login的方式,就算在代码的下面没有调用
#tv和move两个函数,因为@login的原因,每次使用@login,都谁执行一
# 遍login函数,这样看起来是不是很low,下面可以看下结果

# passed user verification....
# passed user verification....

#这里就可以看到我使用了两次@login,login这个函数也被执行了两次


第三部
def login(func):
def inner(arg):
print(‘passed user verification....‘)
func(arg)
return inner

def tv(name):
print(‘welcome [%s] to tv page。。。‘ %(name))

def move(name):
print(‘welcome [%s] to move page...‘ %(name))


tv = login(tv)
tv(‘Bob‘)

第四部
def login(func):
def inner(arg):
print(‘passed user verification....‘)
func(arg)
return inner
@login
def tv(name):
print(‘welcome [%s] to tv page。。。‘ %(name))

@login
def move(name):
print(‘welcome [%s] to move page...‘ %(name))

tv(‘Bob‘)
move(‘Bob‘)

装饰器四部曲