IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python的函数与方法(下) -> 正文阅读

[Python知识库]python的函数与方法(下)

装饰器

  1. 什么是装饰器?
    装饰器顾名思义,一个可以起到装饰作用的工具

    装饰器是谁?
    装饰器本质还是一个函数,是一个嵌套的函数(闭包)
    装饰器装饰谁?
    装饰器(函数)是对现有函数功能的一个补充或增加,它可以更快速、更清晰、大批量的为函数增加功能,让代码更简单更易懂,再不变更原有函数代码的情况下为现有函数功能进行增强
    
  2. 关于函数闭包的概念

    什么是闭包?
    必须有一个嵌套函数(一个函数在另一个函数中)
    这个嵌套函数(内函数)必须引用外部函数的变量
    封闭函数必须返回嵌套函数	
    
def outer_func(x):
	print(x)
	def inner_func(y):
		print x + y
	return inner_func

第一步理解 帮助理解装饰器的一个闭包函数:

def outer_func():
	message = "hi 你好"
	def inner_func():
		print(message)
	return inner_func()
调用:outer_func()
输出:hi 你好

def outer_func():
	message = "hi 你好"
	def inner_func():
		print(message)
	return inner_func
调用:my_func = outer_func()
	 my_func()
输出:hi 你好

第二步理解 注意这次带参数了:

def outer_func(msg):
	message = msg
	def inner_func():
		print(message)
	return inner_func
*注意:这里return的是一个函数名字(实体),并没有(),换言之,他不会执行
调用:
hello_func = outer_func("hello")
python_func = outer_func("python")
hello_func()
python_func()
输出:
hello
python

第三步理解 注意,这次“接近”装饰器了!
不仅仅是“变量”可以作为参数传入函数,“函数”也可以作为参数传入函数

#做一个可以接收“函数”做为参数的函数
def deco_func(original_func):
	def wrapper_func():
		return original_func()
	return wrapper_func

#做一个独立函数
def show_age():
	print("I am 18")

调用:deco_show_age = deco_func(show_age)
	 deco_show_age
输出:I am 18

第四步理解 注意,这次是真的装饰器了!

#先创建装饰器,创建装饰器逻辑
def deco_func(original_func):
	def wrapper_func():
		return original_func()
	return wrapper_func

def show_age():
	print("I am 18")
	
调用:deco_show_age = deco_func(show_age)
	 deco_show_age()
输出:I am 18

#用装饰器去“装饰”,使用装饰器去装饰
def deco_func(original_func):
	def wrapper_func():
		return original_func()
	return wrapper_func
	
@deco_func
def show_age():
	print("I am 18")

调用:show_age()
输出: I am 18
特别注意! 装饰器装饰的函数,会先执行装饰器“函数”,在执行被装饰函数

第五步理解 继续推进-原始函数带参数怎么办?如何提升装饰器的宽容度

def deco_func(original_func):
	def wrapper_func(*args,**kwargs)
		return original_func(*args,**kwargs)
	return wrapper_func

@deco_func
def show_info(name,age):
	print(name,age)

调用:show_info("like",22)
输出:like 22

第六步理解 装饰器可否传入参数?提高装饰器的变通性

def deco_teacher(teacher_name):
	def school_teacher(original_func):
		def wrapper_func(name):
			return original_func(name + "老师是" + teacher_name)
		return wrapper_func
	return school_teacher

@deco_teacher("郭老师")
def stu1():
	print("我叫",name)
调用:stu1("degang")
输出: 我叫 degang 老师是郭老师	

@deco_teacher("岳老师")
def stu2():
	print("我叫",name)
调用:stu2("yunpeng")
输出: 我叫 yunpeng 老师是岳老师	
  1. 装饰器使用案例
#案例一 程序计时器 计算一段程序的执行时长
import time
def timer(func):
	def wrapper():
		start = time.time()
		func()
		end =  time.time()
		return end - start
	return wrapper

@timer
def consumer1():
	l_data = []
	for x in range(1000000):
		l_data.append(x)

@timer
def consumer2():
	time.sleep(2)
#案例二 登录控制 装饰器控制函数访问权限
def login_required(func):
	def wrapper():
		pwd = input("请输入登录密码:")
		if pwd == "123":
			print("登录成功")
			func()
		else:
			print("密码错误,登录失败")
	return wrapper

*执行直接进入
def admin_1():
	print("您已经进入管理后台1")

*询问密码
@login_required
def admin_2():
	print("您已经进入管理后台2")
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:47:09  更:2021-11-16 18:47:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:34:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码