一. 满足闭包函数条件
# 条件一:函数中嵌套函数
# 条件二:外层函数返回内层嵌套函数名
# 条件三:内层嵌套函数有引用外层的一个非全局变量
def func(num, b):
def inner():
print(num)
print(b)
print("这个三计算买书方式的函数")
return inner
res=func(100," python")
res()
print(res.__closure__)
二. 装饰器
# 装饰什么函数,就传什么函数
def login(func):
def fun():
username = 'python3'
password = '123'
user = input("请输入账号:")
pwd = input("请输入密码:")
if user == username and pwd == password:
func()
else:
print("账户或者密码错误")
return fun
@login
def index():
print('这是网站首页')
# 传进去的index在放在closure属性中
# index.__closure__
# index=login(index)
index()
#!/usr/bin/python3
#-*- coding:utf-8 -*-
#@Time:2019-12-11 06:46
# def add(func):
# def fun(a,b):
# print('-:', a-b)
# print('*:', a*b)
# func(a, b)
# return fun
#
1. 装饰有参数的函数
# @add
# def add_num(a,b):
# print("+:", a+b)
# add_num(3,4)
#
# # 装饰无参数的函数
# def index():
# print('这是网站首页')
#
# index()
# # 升级版本:同时装饰有参数和无参数的函数
# def add(func):
# def fun(*args, **kwargs):
# print("调用装饰器功能代码:登录")
# func(*args, **kwargs)
# return fun
# @add
# def index():
# print('这是网站首页')
#
# @add
# def good_list(num):
# print("商品列表第{}页".format(num))
# index()
# print("--------")
# good_list(9)
2.装饰器装饰类
# 升级版本:同时装饰有参数和无参数的函数
# def add(func):
# def fun(*args, **kwargs):
# print("调用装饰器功能代码:登录")
# return func(*args, **kwargs)
# return fun
#
# @add
# class Myclass:
# def __init__(self, name, age):
# self.name=name
# self.age= age
# m=Myclass("alex", 33)
# 未加装饰器
# print(m) #<__main__.Myclass object at 0x1099de5f8>
# 未加装饰器
# print("m的值:", m)
# 作业一:一个玩着呢的闭包需要满足的条件
'''
# 条件一:函数中嵌套函数
# 条件二:外层函数返回内层嵌套函数名
# 条件三:内层嵌套函数有引用外层的一个非全局变量
'''
# 作业二:定义一个计算函数运行时间的装饰器
import time
def clc_time(func):
def fun(*args, **kwargs):
start_time=time.time()
func(*args, **kwargs)
stop_time=time.time()
print("运行时间:", stop_time-start_time)
return fun
# 作业三:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都不许在输入用户名和密码
# {"user":"alex","pwd":"123","token":False}
with open('user') as f:
usrs=eval(f.read())
def login_check(func):
def ado():
while not usrs['token']:
print('------登录页面------')
usrname=input("账号:")
password=input("密码:")
# 登录认证
if usrs['user'] ==usrname and usrs["pwd"] ==password:
usrs['token']=True
func()
else:
print("账号或密码错误")
return ado
@login_check
def index():
print("这个是首页")
@login_check
def page1():
print("这个是第1页")
index()
page1()
# 用类实现装饰器
# 多个装饰器装饰同一个函数
# python中是那个内置的装饰器