python 装饰器

上节课复习
1,函数的嵌套
函数的嵌套调用
def foo():
bar()
函数的嵌套定义
def f1():
def f2():
pass
print(f2)
f2()
2,名称空间与作用域
名称空间:用来存放名字与绑定关系的地方,x=【1,2,3,4,5】
内置名称空间;
1,存放python解释器自带的名字
2,解释器启动时生效,关闭时失效
全局名称空间
1,存放文件级别的名字
2,执行python文件时失效,文件执行完失效
局部名称空间
1,存放函数定义的名字
2,函数调用时失效,函数结束时失效
加载顺序:内置》—全局》局部
名字查找:局部》全局 》 内置

作用域:
全局范围:
内置加全局
全局有效,全局存活
局部范围:
局部
局部有效,局部存活

作用域关系是在函数定义阶段就规定死了,与调用位置无关
也就是说,无论函数在哪儿调用,都必须回到当初定义函数时的位置找作用域关系

为函数体传值的俩种方式
方式1 :直接为该函数添加对应的值
def inner(name):
print(name)
inner('egon')

方式2
def outter(name)
#name=egon
def nner():
print(name)
return inneri

f=outter(’gon‘)
f()


3,函数对象,1可以被引用 2,可以当参数传给另外一个值,3,当函数返回值

4,闭包函数
定义在函数内部的函数,并且该函数包含对外部函数作用域(对全局作用域名字的引用不算闭包)名字的引用,该函数称为闭包函数

def outter():
x=1
def inner():
print(x)
return inner
func=outter()
func()


新知识
1 开放封闭原则
软件一旦上线后,就应该遵循开放封闭原则,对修改源代码是封闭的,对功能的扩展是开放的
也就是我们必须找到一种解决方案:
能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能
总结:1,不修改源代码 2,不修改调用方式
目的: 在遵循1和2的基础上扩展功能

2,什么装饰器?
器指工具,装饰指为被装饰对象添加新功能,装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

#无参装饰器
# import time
# def index():
# start_time=time.time()
# time.sleep(3)
# print('welcome to index page')
# stop_time=time.time()
# print('run time is %' %(stop_time-start_time))
# index()
#
# #修改1
# import time
# def index():
# time.sleep(3)
# print('welcome to index page')
# def home(name):
# time.sleep(5)
# print('welcome%s to home page ' %name)
#
# start_time=time.time()
# index()
# stop_time=time.time()
# print('run time is%s %' %(stop_time-start_time))
#
# start_time=time.time()
# home()
# stop_time=time.time()
# print('run time is% %' %(stop_time-start_time) )

#修改2
# import time
# def index():
# time.sleep(3)
# print('welcome to index page')
#
# def home(name):
# time.sleep(5)
# print('welcome %s to home page' %name)
#
# def wrapper(func):
# start_time = time.time()
# func()
# stop_time = time.time()
# print('run time is% %' %(stop_time-start_time))
#
# wrapper(index)

#修改4
# import time
#
#
# def index():
# time.sleep(3)
# print('welcome to index page')
#
# def outter(func):
# #func=index()
# def wrapper():
# start_time = time.time()
# func()
# stop_time = time.time()
# print(stop_time - start_time)
# return wrapper
#
#
# index=outter(index)
# index()

#无参装饰器升级版
import time


def index():
time.sleep(3)
print('welcome to index page')

def home(name):
time.sleep(2)
print('welcome %s to home page' %name)


def outter(func):
#func=index()
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print(stop_time - start_time)
return res
return wrapper


index=outter(index)
index()
home=outter(home)
home('alex')

res=index()
print(res)

#无参装饰器模板
def outter(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner()

#装饰器语法
import time
def outter(func):
#func=index()
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print(stop_time - start_time)
return res
return wrapper

@outter
def index():
time.sleep(3)
print('welcome to index page')
@outter
def home(name):
time.sleep(2)
print('welcome %s to home page' %name)


def outter(func):
#func=index()
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print(stop_time - start_time)
return res
return wrapper


index()#index=outter(index)
home('alex')#home=outter(home)


res=index()
print(res)


#装饰器认证实现
db_path='db.txt'
import time
currnt_user={
'username':None,
}

def outter(func):
def inner(*args,**kwargs):
if currnt_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res

uname=input('输入用户名: ').strip()
pwd=input('输入密码:').strip()
if uname=='egon' and pwd=='123':#写死了 应该用文件
print('登陆成功')
currnt_user['username']=uname
res=func(*args,**kwargs)
return res

else:
print('用户名或者密码错误')
return inner()
@outter
def index():
time.sleep(1)
print('welcome to indexpage')
return 122
@outter
def home(name):
time.sleep(2)
print('welcom %s to home oage' %name)

index()
home('egon')

原文地址:https://www.cnblogs.com/maojiang/p/8672073.html