python 修饰器的使用

一.万物皆对象

我相信真理,我更相信万物皆对象!

​ -------python

在python中一切都是对象,一个函数可以赋值给一个变量,一个类可以赋值给一个变量.因为函数是普通对象,所以可以作为参数传递,作为另一个函数的返回值

class

以函数作为返回值:

二.函数修饰器的使用 (Function Decorator)

python函数修饰符通过连接一个函数对象@decor,在调用一个callable 的函数对象A时将A传入decor中并执行函数,可以嵌套执行

使用修饰符展现函数运行时间:

decor

将函数test作为参数传递给time_count() 在修饰器内部,test是参数input,test的参数被传递给timed

三.类中方法修饰器(Method Decorator)

根据一切皆对象的概念,可以将类中的方法作为类的属性进行操作,方法装饰器允许通过装饰来覆盖类属性,而不必查找调用函数。

依旧方法的参数被传入了装饰器的内部函数,而方法本身被作为参数传给装饰器函数,在这种情形下,不需要在类内修改方法即可达到目的

四. 类装饰器(Class Decorator)

如果需要装饰器返回一个对象,并且可以对被装饰的可调用对象添加属性或者进行操作,可以定义一个装饰器类

五.多装饰器同时操作 (Chain Decorators)

A function definition may be wrapped by one or more decorator expressions. Decorator expressions are evaluated when the function is defined, in the scope that contains the function definition. The result must be a callable, which is invoked with the function object as the only argument. The returned value is bound to the function name instead of the function object. Multiple decorators are applied in nested fashion. For example, the following code:

即f1返回值作为函数,参数是f2执行完毕后的返回值,注意最先执行的函数是f2即从下往上执行s

输出:

六.装饰时防止信息丢失

如果直接使用装饰器可能导致原方法或者类的属性丢失,如下实例:

输出:

wrap

由于func函数在inner中调用,其信息被inner函数的属性覆盖,可以通过functools.wraps 来避免丢失

七.向装饰器传递参数

Last updated

Was this helpful?