python 3.x 学习笔记5 (装饰器)

时间:2021-11-14 02:46:45

1.装饰器

本质是函数,(装饰其他函数)就是为其他函数添加附加功能

原则:

  1)不能修改被装饰的函数的源代码
  2)不能修改被装饰的函数的调用方式

2.实现装饰器知识储备

  1)函数即“变量”

  2)高阶函数

    a.把一个函数当作实参传给另一个函数(可以做到不修改被装饰函数的源代码的情况下为其添加功能)

    b.返回值中包含函数名)(不修改函数的调用方式)

  3)嵌套函数

3.高阶函数+嵌套函数=》装饰器

 

4.初步装饰器

import time
def timer(func): #timer(test1) func
= test1
def deco():
start_time
= time.time()
func() #run test1
stop_time
= time.time()
print(
'the func run time is %s'%(stop_time-start_time))
return deco

@timer #test1
= timer(test1)
def test1():
time.sleep(
3)
print(
'in the test1')
test1()

5.功能比较完善的装饰器

 

user,passwd = 'hsj','1234'

def auth(auth_type):
print(
'auth func:',auth_type)
def outer_wrapper(func):
def wrapper(
*args, **kwargs):
print(
'wrapper:',*args, **kwargs)
if auth_type == 'local':
username
= input('Username:').strip()
password
= input('Password:').strip()

if username == user and password == passwd:
print(
'\033[32;1mUser has pass authentication\033[0m')
return func(*args, **kwargs) # from home #函数wrapper的返回值
else:
exit(
'\033[31;1mInvalid username or password\033[0m')
elif auth_type
=='ldap':
print(
'ldappppppppp')
return wrapper
return outer_wrapper

def index():
print(
'welcome to index psge')
@auth(auth_type
='local') # 加了括号相当于运行了outer_wraper所以会执行里面内容 # home = auth(home)
def home():
print(
'welcome to home page')
return 'from home' #这里有返回值在装饰器里也应该有个返回值不然是print()不出来的
@auth(auth_type
='ldap')
def bbs():
print(
'welcome to bbs page')

index()
print(home())
bbs()