python什么是装饰器

1 python什么是装饰器

python装饰器本身是一个函数,它在不修改原函数或类的情况下,接受一个原函数或类作为参数,为原函数或类添加新逻辑,然后返回函数或类。是管理函数和类的一种方式。

此处原函数或类,为被修饰的函数或类,也称为主体函数或主体类。

函数装饰器

定义主体函数时进行名称重绑定,提供一个逻辑层来管理函数和方法,或随后对它们的调用。

在主体函数上一行,用@标注装饰器函数,自动调用装饰器函数,且将其返回值赋给主体函数。

用法

python 复制代码
@f_decorator
def testfunc():pass

描述

@f_decorator:模块导入时,自动调用装饰器函数f_decorator;

testfunc:将装饰器函数返回值赋给被装饰函数testfunc变量;

示例

常规调用

python 复制代码
>>> def f_decorator(func):
    print('装饰器函数被调用')
    return func

>>> def testfunc():
    print('testfunc主体函数被调用')

    
>>> fd=f_decorator(testfunc)
装饰器函数被调用
>>> fd()
testfunc主体函数被调用

函数装饰器调用

python 复制代码
# ls.py
def f_decorator(func):
    print('装饰器函数被调用')
    def f_wrap():
        print('f_wrap装饰器返回函数被调用')
        func()
    return f_wrap
# @f_decorator 自动调用装饰器函数
# 将装饰器函数返回值赋给被装饰函数
@f_decorator
def testfunc():
    print('testfunc主体函数被调用')
print('调用装饰器返回的函数'.center(50,'='))
testfunc()

cmd执行结果

python 复制代码
E:\documents\F盘>d:\python39\python.exe ls.py
装饰器函数被调用
====================调用装饰器返回的函数====================
f_wrap装饰器返回函数被调用
testfunc主体函数被调用

类装饰器

定义主体类时进行名称重绑定,提供一个逻辑层来管理类,或随后调用它们所创建的实例。

在主体类上一行,用@标注装饰器函数,自动调用装饰器函数,且将其返回值赋给主体类。

用法

python 复制代码
@c_decorator
class TestCls:pass

描述

@c_decorator:模块导入时,自动调用装饰器函数c_decorator;

TestCls:将装饰器函数返回值赋给被装饰类TestCls变量;

示例

常规调用

python 复制代码
>>> def c_decorator(cls):
    print('装饰器函数被调用')
    def c_wrap():
        print('c_wrap装饰器返回包装函数被调用')
        cls()
    return c_wrap

>>> class TestCls:
    def __init__(self):
        print('TestCls构造函数被调用')

        
>>> cd=c_decorator(TestCls)
装饰器函数被调用
>>> cd()
c_wrap装饰器返回包装函数被调用
TestCls构造函数被调用

函数装饰器调用

python 复制代码
# ls.py
def c_decorator(cls):
    print('装饰器函数被调用')
    def c_wrap():
        print('c_wrap装饰器返回包装函数被调用')
        cls()
    return c_wrap

@c_decorator
class TestCls:
    def __init__(self):
        print('TestCls构造函数被调用')

print('调用装饰器返回的函数'.center(50,'='))
TestCls()

cmd执行结果

python 复制代码
E:\documents\F盘>d:\python39\python.exe ls.py
装饰器函数被调用
====================调用装饰器返回的函数====================
c_wrap装饰器返回包装函数被调用
TestCls构造函数被调用
相关推荐
花酒锄作田28 分钟前
[python]基于动态实例的命令处理设计
python
计算机毕设定制辅导-无忧学长1 小时前
InfluxDB 与 Python 框架结合:Django 应用案例(三)
开发语言·python·django
惜.己1 小时前
python中appium
开发语言·python·appium
小沈熬夜秃头中୧⍤⃝1 小时前
Python 入门指南:从零基础到环境搭建
开发语言·python
睿思达DBA_WGX1 小时前
Python 程序设计讲义(54):Python 的函数——函数概述
开发语言·python
真智AI1 小时前
打破数据质量瓶颈:用n8n实现30秒专业数据质量报告自动化
大数据·运维·人工智能·python·自动化
蛋仔聊测试1 小时前
基于 Playwright(python) 的前端性能测试脚本实现
前端·python
鹿邑网爬1 小时前
Python抖音关键词视频爬取实战:批量下载与分析热门视频数据
爬虫·python
砌玉成璧2 小时前
Flask一个用户同时只能在一处登录实现
后端·python·flask
2202_756749692 小时前
02 基于sklearn的机械学习-KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)、决策树(信息增益、基尼指数)、随机森林
python·算法·决策树·随机森林·机器学习·sklearn