python 学习day8
程序员文章站
2024-02-24 15:06:22
...
# 装饰器:
# 定义:的、本质是函数,(装饰其他函数)就是为其他函数添加新功能
# 原则:1.不能修改被装饰的函数的源代码
# 2.不能修改被装饰的函数的调用方式
# 即:装饰器对被它装饰的函数是完全透明的。
# 实现装饰器知识储存:
# 1.函数即“变量”
# 2.高阶函数 满足其一:1.把一个函数名当做实参传给另一个函数
# 2.返回值中包含函数名
# 3.嵌套函数
# 高阶函数+嵌套函数-->装饰器
# 1.
# 变量名只是值的门牌号;同理,函数名是函数体的门牌号,引用方式:函数名()
# 2.
import time
def foo():
time.sleep(2)
print("in the foo")
def test1(func):
# print(func)
start_time=time.time()
func()
stop_time=time.time()
print("the func run time is%s"%(stop_time-start_time))
test1(foo) #可以添加新功能,但是改变了调用方式
def test2(func):
print("in the test2----")
return func
print(test2(foo))
foo = test2(foo)
foo() #将之前的函数覆盖,没改变函数的调用方式,但是没有添加新功能
test2(foo)()
#3.
def func1():
print("in the func1")
def func2():
print("in the func2")
func2()
func1()
def timmer(func):
def warpper(*args,**kwargs): #不固定参数,为了适应装饰器装饰各种函数
flag=False; #设置标记,记录原本功能是否实现,方便在末尾返回结果
start_time=time.time()
res=func(*args,**kwargs)
flag=True #标记该函数运行了,设置标记可避免在选择或者循环语句中提前return而无法执行后面操作
print(func)
stop_time=time.time()
print("the func run time is%s"%(stop_time-start_time))
if(flag):
return res
return warpper
@timmer # 将装饰器加到想加功能的函数之上;@timmer作用相当于test=timmer(test)
def test():
time.sleep(2) #等待2秒
print("in the test*****")
@timmer
def myname(name):
time.sleep(2) #等待2秒
print("myname is"+ name)
return "myname's return value"
# test=timmer(test)
test() #既没有改变函数调用方式,又添加了新功能
res=myname('刘备')
print(res)
x=0
def grandpa():
x=1
def dad():
x=2
def son():
x=3
print(x)
son()
dad()
grandpa() #只打印了一个3
user,passwd='刘备','abc123'
def auth(auth_type):
print("auth :",auth_type)
def out_wrapper(func): #由于装饰器有参数,则装饰的函数地址移到这一层
def wrapper(*args, **kwargs):
print("wrapper:",*args,**kwargs)
if(auth_type=="local"): #本地验证
username = input("Username:").strip()
password = input("Password:").strip()
flag = False
if (user == username and passwd == password):
print("\033[32;1mUser has passed authentication\033[0m")
res = func(*args, **kwargs)
flag = True
else:
print("\033[31;1mInvalid username or password\033[0m")
if (flag):
return res
elif(auth_type=='ldap'):
print("另一种验证方式~~~")
return wrapper
return out_wrapper
def index():
print("welcome to index page")
@auth(auth_type='local')#装饰器带有参数的时候 home=home
def home():
print("welcome to home page")
return "at home"
@auth(auth_type='ldap')
def bbs():
print("welcome to bbs page")
return "at bbs"
index()
res=home()
if(res):
print(res)
print("--------------------")
res=bbs()
if(res):
print(res)
上一篇: 学习Day2
下一篇: Python学习(Day7)-字符串1