Python知识点:理解和使用装饰器 @decorator

  • 时间:
  • 浏览:0
  • 来源:大发5分快3APP下载_大发5分快3APP官方

通常,大伙儿 需要先实例化有有另另一个类的对象,再调用其法律法律法律依据。

若类的法律法律法律依据使用了@staticmethod或@classmethod,就需要需要实例化,直接类名.法律法律法律依据名()来调用。

从使用上来看,@staticmethod需要指代自身对象的self或指代自身类的cls参数,就跟使用普通函数一样。@classmethod需要self参数,但第有有另另一个参数需就说 我指代自身类的cls参数。将会在@staticmethod中要调用到你这一 类的某些属性法律法律法律依据,并能直接类名.属性名,或类名.法律法律法律依据名的法律法律法律依据。

而@classmethod将会持有cls参数,需要来调用类的属性,类的法律法律法律依据,实例化对象等。

后边的说说中say_hi2 和 say_hi 指向了同样的函数定义,二者的执行结果也相同。

Python的装饰器(decorator)是有有另另一个很棒的机制,也是熟练运用Python的必杀技之一。装饰器,顾名思义,就说 我用来装饰的,它装饰的是有有另另一个函数,保持被装饰函数的原有功能,再装饰上(添油加醋)某些其它功能,并返回含有新增功能的函数对象,好多好多 装饰器本质上是有有另另一个返回函数对象的函数(确切的说,装饰器应该是可调用对象,除了函数,类也需要作为装饰器)。

后边例子中,decorator_func 就说 我定义的装饰器函数,它接受some_func作为参数。它定义了有有另另一个wrapper_func函数,该函数调用了some_func但也增加了某些另一方的代码。

大伙儿 需要通过另外有有另另一个变量say_hi2来引用say_hi函数:

后边代码中,say_hi函数含有有有另另一个参数。通常具体情况下,不同功能的函数需要有不这类别、不同数量的参数,在写wrapper_func的很久,大伙儿 不选着参数的名称和数量,需要通过args 和 *kwargs 来引用函数参数。

前面大伙儿 提到装饰器是可调用对象。在Python后边,除了函数,类也是可调用对象。使用类装饰器,优点是灵活性大,高内聚,封装性。通过实现类內部的__call__法律法律法律依据,当使用 @ 语法糖把装饰器附加到函数上时,就会调用此法律法律法律依据。

类属性@property

静态法律法律法律依据@staticmethod

类法律法律法律依据@classmethod

装饰器(Decorator)

装饰器是可调用对象(callable objects),它用来修改函数或类。

可调用对象就说 我需要接受某些参数并返回某些对象的对象。Python里的函数和类也有可调用对象。

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

在后边的例子中,大伙儿 把say_hi函数当做参数传递给say_more函数,say_hi 被变量 say_hi_func 引用。

类的内置装饰器

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

不过我不要 担心,Python有functools.wraps,wraps并也有也是有有另另一个装饰器,它的作用就说 我把原函数的元信息拷贝到装饰器函数中,使得装饰器函数也有和原函数一样的元信息。

函数装饰器,就说 我接受函数作为参数,并对函数参数做某些包装,因此返回增加了包装的函数,即生成了有有另另一个新函数。

有关Python技术文章优先发布在我的另一方博客:猿学些

公众号:猿学些Pyhton

装饰器是哪些地方?

上述代码中,大伙儿 在say_hi()函数內部定义了另外有有另另一个函数say_name()。say_name()只在say_hi函数內部可见(即,它的作用域在say_hi函数內部),在say_hi外包调用时就会出错。

前面大伙儿 理解了函数,这不不利于大伙儿 接下来弄明白装饰器。

后边代码中使用装饰器的法律法律法律依据看起来很重多样化,其实真正的装饰器的Python语法是那末 的:

要理解Python的装饰器,首先大伙儿 先理解一下Python的函数对象。大伙儿 知道,在Python里一切也有对象,函数就说 我例外,函数是第一类对象(first-class objects),它需要赋值给变量,也需要作为list的元素,需要作为参数传递给其它函数。

装饰器的Python语法

函数需要作为参数传递给其它函数

让大伙儿 看看下面你这一 例子:

函数需要定义在其它函数內部

带参数的装饰器

总结

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

带参数函数的装饰器

函数需要返回其它函数的引用

后边的例子,say_hi函数返回了其內部定义的函数say_name的引用。那末 在say_hi函数內部也需要使用say_name函数了。

类作为装饰器

函数需要被变量引用

在编程过程中,大伙儿 无缘无故遇到那末 的场景:登录校验,权限校验,日志记录等,哪些地方地方功能代码在各个环节都将会需要,但又十分雷同,通过装饰器来抽象、剥离这累积代码需要很好处置这类场景。

使用装饰器极大地复用了代码,怎么我想要有有有另另一个缺点就说 我原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看看下面例子:

不仅被装饰的函数需要带参数,装饰器并也有也需要带参数。参考下面的例子:

定义有有另另一个简单的函数:

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

后边的说说等同于: