Python装饰器
使用Python做爬虫也有3个月的时间了,但是对于Python的相关知识还是有一点缺乏。最近了解到了装饰器,觉得这是我缺乏的一个知识点,因此记录一下。
1.函数
在python中,函数通过def关键字、函数名和可选的参数列表定义。最后可以使用return关键字返回值,如下就是一个简单的函数:
def fun(x):
x +=1
return x
if __name__ == '__main__':
y = fun(1)
print(y)
最后得到结果2.
2.闭包函数
Python是一种面向对象的编程语言,在python中一切皆对象,这样就使得变量所拥有的属性,函数也同样拥有。这样子在函数内创建一个函数是完全合理的,这种函数呗叫做内嵌函数,这种函数值可以在外部函数的作用域内被正常调用,在外部函数的作用域之外调动会报错,给出如下例子。
而如果内部函数里应用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此刻内部函数就被称为闭包函数。闭包函数所用的外部定义的变量叫做自由变量。闭包可以将其自己的代码和作用域以及外部函数的作用结合在一起。下面给出一个简单的闭包的例子:
def bigfun():
a = 1
b = 2
def fun():
c = 3
print(a+c)
return fun()
if __name__ == '__main__':
bigfun()
结果自然就是4.
3.Python装饰器
在了解了闭包函数的概念,我们再理解装饰器会相对容易一些。Python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数的名字,返回经过修改后函数的名字;内层函数负责修饰被修饰函数。Python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事物处理、权限校验等。装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。给出如下一个例子:
import time
def decorator(fun):
def wrapper(*args, **kwargs):
start_time = time.time()
fun()
end_time = time.time()
print(end_time-start_time)
return wrapper
@decorator
def fun():
time.sleep(0.8)
print(1)
if __name__ == '__main__':
fun()
在上面代码中 fun是我要装饰器的函数,我想用装饰器显示fun函数运行的时间。@decorator这个语法相当于 执行 fun = decorator(fun),为fun函数装饰并返回。在来看一下我们的装饰器函数 - decorator,该函数的传入参数是fun(被装饰函数),返回参数是内层函数。这里的内层函数-wrapper,其实就相当于闭包函数,它起到装饰给定函数的作用,wrapper参数为*args, **kwargs。