python装饰器
1. 闭包函数
在看装饰器之前,我们先来搞清楚什么是闭包函数。python是一种面向对象的编程语言,在python中一切皆对象,这样就使得变量所拥有的属性,函数也同样拥有。这样我们就可以理解在函数内创建一个函数的行为是完全合法的。这种函数被叫做内嵌函数,这种函数只可以在外部函数的作用域内被正常调用,在外部函数的作用域之外调用会报错,例如:
而如果内部函数里引用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此时内部函数就被称为闭包函数。闭包函数所引用的外部定义的变量被叫做自由变量。闭包从语法上看非常简单,但是却有强大的作用。闭包可以将其自己的代码和作用域以及外部函数的作用结合在一起。下面给出一个简单的闭包的例子:
def count():
a = 1
b = 1
def sum():
c = 1
return a + c # a - 自由变量
return sum
总结:什么函数可以被称为闭包函数呢?主要是满足两点:函数内部定义的函数;引用了外部变量但非全局变量。
2.python装饰器
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:
实质: 是一个函数
参数:是你要装饰的函数名(并非函数调用)
返回:是装饰完的函数名(也非函数调用)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象做任何的代码上的变动
2.1 函数装饰器
1)不带参数的函数装饰器
def wrapper(func):
def new_func(*args,**kwargs):
print("before")
result=func(*args,**kwargs)
print("after")
return result
return new_func
@wrapper
def row_func(a):
print("hello",a)
return a
row_func(10)
2)带参数的函数装饰器
def wrapper(argument):
def intermedia(func):
def new_func(*args,**kwargs):
print("befer",argument*2)
result=func(*args,**kwargs)
print("after",argument*2)
return result*2
return new_func
return intermedia
@wrapper(100)
def row_func(a):
print("hello,world",a)
return a
print(row_func(10))
对于类方法来说,都会有一个默认的参数self,它实际表示的是类的一个实例,所以在装饰器的内部函数wrapper也要传入一个参数 - me_instance就表示将类的实例p1传给wrapper,其他的用法都和函数装饰器相同。
2.2 类装饰器
1) 不带参数的类装饰器
# class wrapper:
# def __init__(self,func):
# self.func=func
# def __call__(self, *args, **kwargs):
# print("befor")
# result=self.func(*args,**kwargs)
# print("after")
# return result
# @wrapper
# def test(a):
# print("hello,world",a)
# return a
# test(10)
2) 带参数的类装饰器
class wrapper:
def __init__(self,argument):
self.argument=argument
def __call__(self,func):
def new_func(*args,**kwargs):
print("befer",self.argument)
result=func(*args,**kwargs)
print("after",self.argument)
return result
return new_func
@wrapper("luck")
def test(a):
print("hello,",a)
return a
test(10)
还没有评论,来说两句吧...