菜鸟python3装饰器_python3-装饰器基础使用

知识点

简单的装饰器

带有参数的装饰器

带有自定义参数的装饰器

类装饰器

装饰器嵌套

@functools.wrap装饰器使用

基础使用

简单的装饰器

def my_decorator(func):

def wrapper():

print('wrapper of decorator')

func()

return wrapper()

def test():

print('test done.')

test = my_decorator(test)

test

输出:

wrapper of decorator

test done.

这段代码中,变量test指向了内部函数wrapper(), 而内部函数wrapper()中又会调用原函数test(),因此最后调用test()时,就会打印'wrapper of decorator' 然后输出 'test done.'

这里的函数my_decorator()就是一个装饰器,它把真正需要执行的函数test()包裹在其中,并且改变了它的行为,但是原函数test()不变。

上述代码在Python中更简单、更优雅的表示:

def my_decorator(func):

def wrapper():

print('wrapper of decorator')

func()

return wrapper()

@my_decorator

def test():

print('test done.')

test

这里的@, 我们称为语法糖,@my_decorator就相当于前面的test=my_decorator(test)语句

如果程序中又其他函数需要类似装饰,只需要加上@decorator就可以,提高函数的重复利用和程序可读性

带有参数的装饰器

def args_decorator(func):

def wrapper(*args, **kwargs):

print('wrapper of decorator')

func(*args, **kwargs)

return wrapper

@args_decorator

def identity(name, message):

print('identity done.')

print(name, message)

identity('changhao', 'hello')

输出:

wrapper of decorator

identity done.

changhao hello

通常情况下,会把args和*kwargs,作为装饰器内部函数wrapper()的参数。 表示接受任意数量和类型的参数

带有自定义参数的装饰器

定义一个参数,表示装饰器内部函数被执行的次数,可以写成这个形式:

def repeat(num):

def my_decorator(func):

def wrapper(*args, **kwargs):

for i in range(num):

func(*args, **kwargs)

return wrapper

return my_decorator

@repeat(3)

def showname(message):

print(message)

showname('changhao')

输出:

changhao

changhao

changhao

类装饰器

类也可以作装饰器,类装饰器主要依赖于函数 __call__每当调用一个示例时,函数__call__()就会被执行一次。

class Count:

def __init__(self, func):

self.func = func

self.num_calls = 0

def __call__(self, *args, **kwargs):

self.num_calls += 1

print('num of calls is: {}'.format(self.num_calls))

return self.func(*args, **kwargs)

@Count

def example():

print('example done.')

example()

example()

输出:

num of calls is: 1

example done.

num of calls is: 2

example done.

这里定义了类Count,初始化时传入原函数func(),而__call__()函数表示让变量num_calls自增1,然后打印,并且调用原函数。因此我们第一次调用函数example()时,num_calls的值是1,而第一次调用时,值变成了2。

装饰器的嵌套

import functools

def my_decorator1(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

print('execute decorator1')

func(*args, **kwargs)

return wrapper

def my_decorator2(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

print('execute decorator2')

func(*args, **kwargs)

return wrapper

@my_decorator1

@my_decorator2

def test2(message):

print(message)

test2('changhao')

输出:

execute decorator1

execute decorator2

changhao

@functools.wrap装饰器使用

import functools

def my_decorator(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

print('wrapper of decorator')

func(*args, **kwargs)

return wrapper

@my_decorator

def test3(message):

print(message)

test3.__name__

输出

test3

通常使用内置的装饰器@functools.wrap,他会保留原函数的元信息(也就是将原函数的元信息,拷贝到对应的装饰器里)

装饰器用法实例

身份认证

import functools

def authenticate(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

request = args[0]

if check_user_logged_in(request):

return func(*args, **kwargs)

else:

raise Exception('Authentication failed')

return wrapper

@authenticate

def post_comment(request):

pass

这段代码中,定义了装饰器authenticate;而函数post_comment(),则表示发表用户对某篇文章的评论。每次调用这个函数前,都会检查用户是否处于登录状态,如果是登录状态,则允许这项操作;如果没有登录,则不允许。

日志记录

import time

import functools

def log_execution_time(func):

@functools.wraps(func)

def wrapper(*args, **kwargs):

start = time.perf_counter()

res = func(*args, **kwargs)

end = time.perf_counter()

print('{} took {} ms'.format(func.__name__, (end - start) * 1000))

return wrapper

@log_execution_time

def calculate_similarity(times):

pass

这里装饰器log_execution_time记录某个函数的运行时间,并返回其执行结果。如果你想计算任何函数的执行时间,在这个函数上方加上@log_execution_time即可。

总结

所谓装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要下载runoob菜鸟教程的Python3教程可以按照以下步骤进行操作: 第一步,打开浏览器,进入runoob的官方网站(www.runoob.com)。 第二步,点击网站顶部的菜单栏中的“Python3教程”按钮,进入Python3教程页面。 第三步,浏览Python3教程页面,找到需要下载的教程内容。 第四步,点击想要下载的教程链接,进入该教程的具体页面。 第五步,页面上方会有一个“下载”按钮,点击该按钮。 第六步,弹出下载窗口后,选择保存文件的路径和名称。 第七步,点击保存按钮,开始下载教程内容。 第八步,等待下载完成后,可以在保存的路径中找到下载好的教程文件。 以上就是下载runoob菜鸟教程Python3教程的步骤,按照以上方法进行操作,就可以获得所需的教程资料了。希望能对你有所帮助,并祝学习顺利! ### 回答2: 要下载菜鸟教程的Python 3教程,可以按照以下步骤进行操作。 首先,打开浏览器,并在地址栏中输入网址 "www.runoob.com",打开菜鸟教程的官方网站。 在菜鸟教程的主页上,可以看到导航栏,其中有一个分类为 "编程语言",将鼠标悬停在该分类上,会弹出一个下拉菜单。在下拉菜单中,点击 "Python"。 点击后,会跳转到Python的教程页面。在左侧的导航栏中,可以看到不同的章节和主题。找到所需的教程章节,点击进入。 进入具体的教程页面后,可以按照自己的学习需求,阅读教程内容。在页面的顶部,可以看到一排按钮,其中一个按钮上写着 "下载教程",点击该按钮。 点击后,浏览器会开始下载菜鸟教程的Python 3教程的PDF文件。根据浏览器的设置,可能会出现一个弹窗询问是否保存文件,可以选择保存到自己想要保存的位置,然后点击保存。 待下载完成后,就可以在保存的位置找到已下载的PDF文件,可以使用PDF阅读器打开文件,随时查看学习。 总结:要下载菜鸟教程的Python 3教程,只需通过菜鸟教程官方网站找到对应的教程页面,然后点击下载按钮即可获取教程的PDF文件,方便自己在任何时间和地点学习。 ### 回答3: 要下载runoob菜鸟教程的Python 3教程,首先需要打开runoob的官方网站。在网站的首页上,我们可以找到一个搜索框,输入"Python"并点击搜索按钮。在搜索结果页面上,会显示出与Python相关的教程列表。 找到Python 3的教程并点击进入,会打开一个新的页面,里面包含了详细的Python 3教程内容。我们可以逐个点击不同章节来学习Python的各个方面,例如基础语法、数据类型、流程控制、函数、模块等等。在每个章节的最下方,会有一个下载链接,点击该链接即可下载该章节对应的教程内容。 一旦下载完成,我们可以使用任何支持文本编辑的软件来打开教程内容,比如记事本或者专门的代码编辑器。通过阅读这份教程,我们可以学习到Python 3的基础知识和常用语法,从而能够编写简单的Python程序。 此外,runoob菜鸟教程还提供了在线的Python 3编译器,我们可以在浏览器中直接运行和测试自己编写的Python代码,无需在本地安装Python环境。这样方便快捷地进行学习和实践。 总结来说,要下载runoob菜鸟教程的Python 3教程,只需访问runoob官方网站,搜索并进入Python 3教程页面,点击下载链接获取教程内容,然后使用文本编辑软件阅读学习。同时,也可以利用runoob提供的在线编译器进行自我实践。通过这些方法,我们可以充分利用runoob菜鸟教程的Python 3教程资源,提升自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值