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.装饰器的原型

问题: 在执行printInfo函数前,进行权限校验;执行后,进行日志记录
    不允许修改printInfo函数

def check(func):
    def checkAndLog():
        print("函数运行前:权限校验...")
        func()
        print("函数运行后:日志记录...")
    return checkAndLog

def printInfo():
    print("我是一个普通的函数")

newFunc = check(printInfo)
print("-"*30)
newFunc()
print("-"*30)
printInfo()
print("-"*30)
------------------------------
函数运行前:权限校验...
我是一个普通的函数
函数运行后:日志记录...
------------------------------
我是一个普通的函数
------------------------------

3.装饰器的定义与调用

def check(func):
    def checkAndLog():
        print("函数运行前:权限校验...")
        func()
        print("函数运行后:日志记录...")
    return checkAndLog

@check         #定义装饰器的位置,相当于check(printInfo)
def printInfo():
    print("我是一个普通的函数")

printInfo() #执行函数前,会先执行装饰器
函数运行前:权限校验...
我是一个普通的函数
函数运行后:日志记录...

4. 装饰器的嵌套

  • 两个及多个装饰器可以装饰同一个函数
  • 执行过程为:自下而上逐步修饰,完成后一次性输出
def zsA(func):
    def resFunc():
        print("zsA执行前...")
        func()
        print("zsA执行后...")
    return resFunc
def zsB(func):
    def resFunc():
        print("zsB执行前...")
        func()
        print("zsB执行后...")
    return resFunc
print("-"*30)
#朴素写法:
def test():
    print("这是测试函数")
res1 = zsA(test)
res2 = zsB(res1)
res2()
print("-"*30)
#使用装饰器写法:自下而上逐步修饰,完成后一次性输出
@zsB
@zsA
def test():
    print("这是测试函数")
test()
print("-"*30)
------------------------------
zsB执行前...
zsA执行前...
这是测试函数
zsA执行后...
zsB执行后...
------------------------------
zsB执行前...
zsA执行前...
这是测试函数
zsA执行后...
zsB执行后...
------------------------------

5. 带有参数的装饰器

如果原函数带有参数,那么返回的新函数也要带有参数,且参数一一对应

def tool(func):
    def log(name,pwd):
        print(f"日志记录:【{name}:{pwd}】")
        func(name,pwd)
    return log
@tool
def login(name,pwd):
    print(f"用户名:{name},密码:{pwd}")
    
login("admin",123456)
日志记录:【admin:123456】
用户名:admin,密码:123456

6. 带返回值的装饰器

如果原函数带有返回值,装饰器也要有返回值,才能将原有函数的执行结果传递出来。

def tool(func):
    def log(name, pwd):
        print(f"日志记录:【{name}:{pwd}】")
        state = func(name, pwd)
        return state
    return log
@tool
def login(name,pwd):
    print(f"用户名:{name},密码:{pwd}")
    if name == "admin" and pwd == 123456:
        return "登录成功"
    return "登录失败"

res = login("admin",12345678)
print(res)
日志记录:【admin:12345678】
用户名:admin,密码:12345678
登录失败

7. 定义通用装饰器

增加装饰器的适用性,可以使用可变参数,以保证装饰器能够适用于更多的函数。

def tool(func):
    def log(*args,**kwargs):
        print(f"日志记录前...")
        state = func(*args,**kwargs)
        print("日志记录后...")
        return state
    return log
@tool
def login(name,pwd,fjxx):
    print(f"用户名:{name},密码:{pwd},附加信息:{fjxx}")
    if name == "admin" and pwd == 123456:
        return "登录成功"
    return "登录失败"

res = login("admin",12345678,"dadafaaf")
print(res)
日志记录前...
用户名:admin,密码:12345678,附加信息:dadafaaf
日志记录后...
登录失败

8. 使用面向对象的方式定义装饰器

调用时应用call方法调用内部函数

class MyTool:

    def __call__(self, func):
        return self.tool2(func)
    def tool1(func):
        def log():
            print("log....")
            func()
        return log
    def tool2(self,func):
        def check():
            print("check....")
            func()
        return check
#调用方法一
@MyTool.tool1
def test():
    print("test....")
print("调用方法一:")
test()

#调用方法二
@MyTool()   #MyTool通过函数方式调用,默认触发__call__方法
def test():
    print("test....")
print("调用方法二:")
test()

调用方法一:
log....
test....
调用方法二:
check....
test....

总结

本篇文章简要介绍了装饰器的基本概念,几种常用装饰器的定义和调用方法。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:28:10  更:2022-01-17 11:30:22 
 
开发: 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 1:39:56-

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