python渲染光线_python函数-装饰器

本文深入探讨Python装饰器,遵循开放封闭原则,介绍如何在不修改原函数的基础上添加新功能。从简单装饰器到带返回值和参数的装饰器,以及使用`wraps`保持元信息不变,逐步解析装饰器的实现和应用场景。同时展示了多个装饰器的叠加使用,展示其灵活性。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值