Python修饰器
1.什么叫做闭包?
答: 闭包是内部函数对外部函数作用域内部变量的引用
闭包的详细定义:
- 函数内的属性,都是有生命周期的,都是在函数执行期间
- 内部函数对外部函数作用域内变量的引用
- 闭包内的闭包函数私有化了变量,完成了对数据的封装,类似于面向对象
2.为什么要用装饰器,直接改原函数不好吗?
答: 装饰器可以在不影响原有函数功能的情况下,添加新的功能
- 简单装饰
#简单装饰
def decorate(func):
def wrap():
print("I need to decorate this function")
return func() #返回被装饰函数的调用
return wrap
# return func 返回一个集装箱
# return func() 返回一个函数调用
@decorate
def mysum():
print("sum")
#mysum() -> decorate(mysum)() -> wrap()
mysum()
2.带参数的装饰
#带参数的装饰
def decorate(func):
def wrap(a,b):
print("I need to decorate this function")
a = a + 5
b = b + 5
return func(a,b) #返回被装饰函数的调用
return wrap
# Python3中参数可以用中文
@decorate
def mysum(a,b):
print("sum",a+b)
#mysum(1,2) -> decorate(mysum)(1,2) -> wrap(1,2)
mysum(1,2) #无修饰是3,有修饰是13
3.不同函数用同一个修饰器修饰
#不同函数用同一个修饰器修饰
def arg_decorate(method):
def decorate(func):
def wrap(a,b):
print("I need to decorate this function")
if method == "sum":
a = a + 5
b = b + 5
elif method == "minus":
a = a + 5
b = b - 5
return func(a,b) #返回被装饰函数的调用
return wrap
@arg_decorate(method="sum")
def mysum(a,b):
print("sum",a+b)
@arg_decorate(method="minus")
def myminus(a,b):
print("minus",a-b)
#mysum(1,2) -> decorate(mysum)(1,2) -> wrap(1,2)
mysum(1,2) #无修饰是3,有修饰是13
myminus(2,1)# 无修饰是1,有修饰是11