对装饰器的简单认识

---恢复内容开始---

什么是闭包

如果在一个内部函数里,对外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包

 

 

def outer():
x = 10
def inner(): #inner是内部函数
print(x) #x是外部作用域的变量
return inner #inner 就是一个闭包

闭包 = 内部函数+ 定义函数时的环境

---恢复内容结束---

装饰器的简单认识

import time
def show_time(x):
def inner():
start = time.time()
x()
end = time.time()
print("spend %s"%(end - start))
return inner

def first():
print("Are you ok 1")
time.sleep(2)
first = show_time(first) # foo 等于执行show_time函数并传入first函数为参数,然后将inner作为一个返回值返回,让foo 接受,
first() #foo()等于执行inner函数


@show_time #second = show_time(second)
def second():
print("Are you ok")
time.sleep(3)
second() #加了装饰器的 second 函数 相当于 second = showtime(second) second的执行顺序,首先去执行show_time函数,然后去执行inner函数,
                    # #inner函数需要执行x()函数,show_time 将 second 函数作为一个参数已经传入了,此时的x相当于形参 x()相当于执行了函数second()函数


#给功能函数加参数
import time
def show_time(x):
def inner(*args,**kwargs):
start = time.time()
x(*args,**kwargs)
end = time.time()
print("spend %s"%(end - start))
return inner

@show_time #second = show_time(second)
def second(*args,**kwargs):
sums = 0
for i in args:
sums += i
print(sums)
time.sleep(3)
second(1,2,3,4,56)



#给装饰器函数加参数

import time
def looger(flag=""):
def show_time(x):
def inner(*args,**kwargs):
start = time.time()
x(*args,**kwargs)
end = time.time()
print("spend %s"%(end - start))
if flag == "true":
print("记录日志")
return inner
return show_time

@looger("true") #@logger = show_time
def second(*args,**kwargs):
sums = 0
for i in args:
sums += i
print(sums)
time.sleep(3)
second(12,23,34,45) #此时执行second函数,相当于执行looger函数,looger函数 = 执行show_time函数,执行show_time函数 = 执行inner函数 ,执行inner函数相当于执行 second函数
#此时的装饰器函数可以接受一个参数(“true”)和show_time(x)的x不同的是,参数true只是一个参数,而x指的是second函数




#用装饰器实现简单的登录
login_status = False
username,password ="admin","123456"

def choose(flag=""):
def looger(func):
def stamp():
global login_status
if login_status == False:
username1 = input("username:")
password2 = input("password:")

if flag =="jd":
print("欢迎使用京东账号登录")
if username == username1 and password == password2:
func()
login_status == True
if flag =="wx":
print("欢迎使用微信登录")
if username == username1 and password == password2:
func()
login_status == True
return stamp
return looger
@choose("jd")
def jingdong():
print('Welcome to JD')
@choose("wx")
def weixing():
print("Welcome to WeiXing")

if __name__ == '__main__':

jingdong()

 

posted @ 2019-05-28 22:08  我也不想这么菜  阅读(49)  评论(0编辑  收藏  举报