百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[其它内容] 如何使用Python装饰器来修改函数 [复制链接]
查看:143 | 回复:1

1477

主题

1656

帖子

9

积分

落伍者(一心一意)

Rank: 1

贡献
685
鲜花
0
注册时间
2016-6-22

落伍者落伍微信绑定落伍手机绑定

发表于 2024-1-10 15:34:15 | 显示全部楼层 |阅读模式 来自 中国江苏淮安
华科云商丑图1.jpg
在Python中,装饰器是一种强大的工具,它可以用来修改函数的行为,而无须对函数本身进行修改。装饰器提供了一种简洁、灵活的方式来扩展函数的功能,使代码更加模块化、可复用,并且能够减少重复的代码。

装饰器的基本概念是将一个函数作为参数传递给另一个函数,并返回一个新的函数。这个新的函数通常会在原始函数执行前后添加额外的操作或功能。通过装饰器,我们可以改变函数的行为,而无须修改原始函数的定义。

下面,让我们来看一些实际的例子,了解如何使用装饰器来修改函数。

1.添加日志功能的装饰器

假设我们有一个函数`add`,用于计算两个数字的和,并返回结果。现在,我们想要在每次调用这个函数时记录一条日志。

```python

def log_decorator(func):

def wrapper(*args,**kwargs):

print(f"Calling function:{func.__name__}")

result=func(*args,**kwargs)

print(f"Function{func.__name__}called")

return result

return wrapper

log_decorator

def add(a,b):

return a+b

result=add(3,5)

print(result)#输出结果为8

```

在这个例子中,我们定义了一个装饰器函数`log_decorator`,它接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数内部,我们首先打印一条日志,然后调用原始函数`func`,并将其结果存储在`result`变量中。最后,我们再次打印一条日志,并返回结果。

通过在`add`函数的定义之前添加` log_decorator`,我们将`add`函数传递给了装饰器函数,并将返回的新函数绑定到`add`上。这样,每次调用`add`函数时,实际上是调用了被装饰后的函数`wrapper`。

2.添加性能计时功能的装饰器

另一个常见的使用装饰器的场景是添加性能计时功能。下面是一个示例:

```python

import time

def timer_decorator(func):

def wrapper(*args,**kwargs):

start_time=time.time()

result=func(*args,**kwargs)

end_time=time.time()

execution_time=end_time-start_time

print(f"Function{func.__name__}executed in{execution_time}seconds")

return result

return wrapper

timer_decorator

def fibonacci(n):

if n<=1:

return n

else:

return fibonacci(n-1)+fibonacci(n-2)

result=fibonacci(10)

print(result)#输出结果为55

```

在这个例子中,我们定义了一个装饰器函数`timer_decorator`,它用于计算函数的执行时间。在`wrapper`函数内部,我们使用`time.time()`方法获取当前时间,然后调用原始函数`func`,并将其结果存储在`result`变量中。接着,我们再次使用`time.time()`方法获取当前时间,并计算出函数的执行时间。最后,我们打印出执行时间,并返回结果。

通过在`fibonacci`函数的定义之前添加` timer_decorator`,我们将`fibonacci`函数传递给了装饰器函数,并将返回的新函数绑定到`fibonacci`上。这样,每次调用`fibonacci`函数时,实际上是调用了被装饰后的函数`wrapper`。

3.多个装饰器的组合使用

装饰器还支持多个装饰器的组合使用,可以一次性对函数进行多个修改。例如:

```python

def log_decorator(func):

def wrapper(*args,**kwargs):

print(f"Calling function:{func.__name__}")

result=func(*args,**kwargs)

print(f"Function{func.__name__}called")

return result

return wrapper

def timer_decorator(func):

def wrapper(*args,**kwargs):

start_time=time.time()

result=func(*args,**kwargs)

end_time=time.time()

execution_time=end_time-start_time

print(f"Function{func.__name__}executed in{execution_time}seconds")

return result

return wrapper

log_decorator

timer_decorator

def multiply(a,b):

return a*b

result=multiply(3,5)

print(result)#输出结果为15

```

在这个例子中,我们定义了两个装饰器函数`log_decorator`和`timer_decorator`。通过将它们按照从上到下的顺序应用于`multiply`函数,我们可以先添加日志功能,再添加性能计时功能。

使用装饰器,我们可以以一种简洁、灵活的方式来修改函数的行为,而无须修改函数本身的定义。装饰器可以用于添加日志、性能计时、验证参数等功能,使代码更加模块化、可复用,并且能够减少重复的代码。通过组合多个装饰器,我们可以一次性对函数进行多个修改,使其具有更多的功能和特性。

因此,在编写Python代码时,不妨尝试使用装饰器来修改函数,体验其带来的便利和魔力!
企业专线拨号VPS动态IP派克斯ADSL本地拨号,联系QQ174629754
回复

使用道具 举报

52

主题

2569

帖子

606

积分

落伍者(一心一意)

Rank: 1

贡献
1103
鲜花
1
注册时间
2014-9-11

落伍微信绑定落伍者落伍手机绑定

发表于 2024-1-10 22:13:26 | 显示全部楼层 来自 中国广东深圳
不错的东西,sztjdkj  ~ 感谢分享 [url=http://www.sztjdkj.com]sztjdkj[/url]
不错的东西,sztjdk ~ 感谢分享 [url=http://www.sztjd.com]sztjd[/url]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2025-4-3 11:28 , Processed in 0.067196 second(s), 35 queries , Gzip On.

返回顶部