python函数-装饰器

python函数-装饰器#

1.装饰器的原则--开放封闭原则#

 开放:对于添加新功能是开放的

封闭:对于修改原功能是封闭的

2.装饰器的作用#

在不更改原函数调用方式的前提下对原函数添加新功能

3.装饰器的本质--闭包#

4.装饰器#

  (1)简单的装饰器

复制代码
def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        f()
        """原函数后添加的功能"""
    return wrapper

def func():
    print('这是原函数!')

func = deco(func)
func()
复制代码

 

  (2)装饰器的语法糖-----@deco

复制代码
def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        f()
        """原函数后添加的功能"""
    return wrapper

@deco # ——>此处效果等同于 func = deco(func)
def func():
    print('这是原函数')

func()
复制代码

 

  (3)带返回值的装饰器

复制代码
def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        res = f()
        """原函数后添加的功能"""
        return res
    return wrapper

@deco
def func():
    print('这是原函数')
func()
复制代码

 

  (4)装饰器加参数的固定格式

复制代码
def deco(f):
    def wrapper(*args,**kwargs):
        """原函数前添加的功能"""
        res = f(*args,**kwargs)
        """原函数后添加的功能"""
        return res
    return wrapper

@deco
def func(*args,**kwargs):
    print('这是原函数')
func()
复制代码

 

  (5)装饰器的固定格式--wraps版

复制代码
from functools import wraps

def wrapper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        print('在被装饰的函数执行之前做的事')
        ret = func(*args,**kwargs)
        print('在被装饰的函数执行之后做的事')
        return ret
    return inner
@wrapper
def holiday(day):
    print("新年快乐")
    return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret)


>>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心
复制代码

  

  (6)多个装饰器装饰一个函数 

复制代码
def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner2

@wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():
    print('in f')

f()

>>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
复制代码

 

  

  

posted @   流年中渲染了微笑  阅读(224)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
CONTENTS