建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看。

猿人学python之我的学习笔记分享:如何使用装饰器 @decorator

上面代码中使用装饰器的方法看起来有点复杂,其实真正的装饰器的Python语法是这样的:

装饰器的Python语法@decorator_funcdef say_hi():

print 'Hi!'

@ 符合是装饰器的语法糖,在定义函数say_hi时使用,避免了再一次的赋值语句。

上面的语句等同于:def say_hi():

print 'Hi!'say_hi = decorator_func(say_hi)

装饰器的顺序@a@b@cdef foo():

print('foo')# 等同于:foo = a(b(c(foo)))

带参数函数的装饰器def decorator_func(some_func):

def wrapper_func(*args, **kwargs):

print("Wrapper function started")

some_func(*args, **kwargs)

print("Wrapper function ended")

return wrapper_func@decorator_func    def say_hi(name):

print ("Hi!" + name)

上面代码中,say_hi函数带有一个参数。通常情况下,不同功能的函数可以有不同类别、不同数量的参数,在写wrapper_func的时候,我们不确定参数的名称和数量,可以通过*args 和 **kwargs 来引用函数参数。

带参数的装饰器

不仅被装饰的函数可以带参数,装饰器本身也可以带参数。参考下面的例子:def use_logging(level):

def decorator(func):

def wrapper(*args, **kwargs):

if level == "warn":

logging.warn("%s is running" % func.__name__)            return func(*args)        return wrapper    return decorator@use_logging(level="warn")def foo(name='foo'):

print("i am %s" % name)

简单来说,带参数的装饰器就是在没有参数的装饰器外面再嵌套一个参数的函数,该函数返回那个无参数装饰器即可。

类作为装饰器

前面我们提到装饰器是可调用对象。在Python里面,除了函数,类也是可调用对象。使用类装饰器,优点是灵活性大,高内聚,封装性。通过实现类内部的__call__方法,当使用 @ 语法糖把装饰器附加到函数上时,就会调用此方法。class Foo(object):

def __init__(self, func):

self._func = funcdef __call__(self):

print ('class decorator runing')

self._func()    print ('class decorator ending')@Foodef say_hi():

print('Hi!')

say_hi()# Output:# class decorator running# Hi!# class decorator ending

functools.wraps

使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看看下面例子:def decorator_func(some_func):

def wrapper_func(*args, **kwargs):

print("Wrapper function started")

some_func(*args, **kwargs)

print("Wrapper function ended")

return wrapper_func@decorator_func    def say_hi(name):

'''Say hi to somebody'''

print ("Hi!" + name)

print(say_hi.__name__)  # Output: wrapper_funcprint(say_hi.__doc__)   # Output: None

可以看到,say_hi函数被wrapper_func函数取代,它的__name__ 和 docstring 也自然是wrapper_func函数的了。

不过不用担心,Python有functools.wraps,wraps本身也是一个装饰器,它的作用就是把原函数的元信息拷贝到装饰器函数中,使得装饰器函数也有和原函数一样的元信息。from functools import wrapsdef decorator_func(some_func):    @wraps(func)

def wrapper_func(*args, **kwargs):

print("Wrapper function started")

some_func(*args, **kwargs)

print("Wrapper function ended")

return wrapper_func@decorator_func    def say_hi(name):

'''Say hi to somebody'''

print ("Hi!" + name)

print(say_hi.__name__)  # Output: say_hiprint(say_hi.__doc__)   # Output: Say hi to somebody

类的内置装饰器

类属性@property

静态方法@staticmethod

类方法@classmethod

通常,我们需要先实例化一个类的对象,再调用其方法。

若类的方法使用了@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

从使用上来看,@staticmethod不需要指代自身对象的self或指代自身类的cls参数,就跟使用普通函数一样。@classmethod不需要self参数,但第一个参数必须是指代自身类的cls参数。如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名,或类名.方法名的方式。

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等。

总结

通过认识Python的函数,我们逐步弄清了装饰器的来龙去脉。装饰器是代码复用的好工具,在编程过程中可以在适当的场景用多多使用。

如何使用python装饰器_Python学习之如何使用装饰器 @decorator相关推荐

  1. python什么是装饰器_python学习之装饰器是什么?

    学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...

  2. python文件下载速度 装饰器_python学习笔记之---装饰器

    # -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...

  3. python内置哪些装饰器_Python内置的wraps装饰器有什么用

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  4. python布局管理_Python基础=== Tkinter Grid布局管理器详解

    本文转自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html          @ 箬笠蓑衣 Grid(网格)布局管理器会将控件放置到一个二维的表 ...

  5. 自学python困难吗_Python学习难不难?零基础好学吗?

    Python学习难不难?零基础好学吗?我想对于很多人来说,这都是非常关键的问题,也是很多人都在疑惑的问题.现在市场发展,行业的竞争压力是非常大的,转型的人也是非常多,对于不少人转型人才来说,Pytho ...

  6. python龟图_python学习turtle(龟图标状态)

    2019独角兽企业重金招聘Python工程师标准>>> 记录学习 turtle.hideturtle() turtle.ht(),隐藏龟图标. turtle.showturtle() ...

  7. 自学python如何就业_python学习:想要自学Python达到就业的水平,应该怎么去学习...

    点击蓝字"python教程"关注我们哟! 这篇文章主要给大家讲解学习Python技术应该如何学习才能达到企业要求 内容会涉及到Python的学习技巧以及系统的学习知识安排和学习方法 ...

  8. python论文结论_Python学习总结

    在过去的两周,通过对python基础知识的学习以及通过一个具体的小游戏的练习,大概对Python有了一个初步的了解,在这里做一个总结,希望对今后的进一步学习有帮助. 之前学习过C语言,在学习了Pyth ...

  9. 有哪些免费自学python的网站_Python学习网站有哪些?Python基础教程网站推荐

    Python学习网站有哪些?Python基础教程网站推荐:菜鸟教程.PHP中文网.PHP中文网.W3C.Reddit.博学谷.python中文学习大本营.Python 3 Module of the ...

最新文章

  1. C++知识点5——迭代器简述
  2. [转载]Android开发常用调试技术记录
  3. Java的一维数组和二维数组的关系
  4. Spring5 - Bean的初始化和销毁的4种方式
  5. 备战实习求职的一些感想(已拿阿里offer)
  6. matlab rltool,matlab工具箱
  7. 2020蓝桥杯省赛---java---B---5( REPEAT 程序)
  8. Python函数合集:68个内置函数请收好!
  9. nio的应用 java_Java NIO的理解和应用
  10. C# 10 的五大新功能
  11. linux自定义全局命令
  12. 用户输出表单处理php
  13. 银监会再出新规!银行数据治理与监管评级挂钩
  14. 四叶草引导linux教程,百科全书之黑苹果四叶草引导配置 boot讲解
  15. MT8127_Android_scatter.txt 文件添加backup分区
  16. 九连环问题c语言程序,九连环游戏的算法源代码
  17. CTF挑战赛-合天网安实验室-Reverse逆向100writeup
  18. 学习工具001:PPT画图配色
  19. 安卓app开机自启动的几种方式
  20. 《Kotin 极简教程》第13章 使用 Kotlin 和 Anko 的Android 开发

热门文章

  1. 调节e18-d80nk的测量距离_水准测量基础知识
  2. 国潮艺术插画设计没有灵感看这里
  3. 礼品盒子插画素材丨节日设计加上它之后价值翻倍!
  4. 尽显中国风 | 高品质海报背景,PSD分层,智能替换展示商品
  5. 限时抢购促销海报设计没想法,看这里!眼见的倒计时紧迫感
  6. 蒸汽朋克简单图形免扣PNG素材,让设计艺术变得简单
  7. eBPF bpftrace 实现个UNIX socket抓包试试
  8. Paging Structures in the Different Paging Modes
  9. Open5GS:开源5G
  10. raid 物理盘缓存状态_CDN与其他层面缓存