一. 满足闭包函数条件# 条件一:函数中嵌套函数# 条件二:外层函数返回内层嵌套函数名# 条件三:内层嵌套函数有引用外层的一个非全局变量 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 @logindef 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 timedef 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_checkdef index(): print("这个是首页") @login_checkdef page1(): print("这个是第1页")index()page1() # 用类实现装饰器# 多个装饰器装饰同一个函数# python中是那个内置的装饰器
原文地址:https://www.cnblogs.com/vivian0119/p/12024946.html
时间: 2024-10-03 07:15:58