装饰器 decorators
什么是装饰器
装饰器是一个函数,主要作用是用来包装另一个函数或类(后面会讲)
作用:
是在不改变原函数名(或类名)的情况下改变被包装对象的行为
函数装饰器:
函数装饰器是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数
语法:
def 装饰器函数名(参数):
语句块
return 函数对象
@装饰器函数名<换行>
def 函数名(形参列表):
语句块
示例:
def mydeco(fn):
def fx():
print("++++++++这是myfunc调用之前++++++++")
# 要想在此处调用被装饰的函数myfunc怎么办?
fn() # 调用被装饰函数
print("--------这是myfunc调用之后--------")
return fx
@mydeco
def myfunc():
print("函数myfunc被调用")
myfunc()
# 此示例示意装饰器在不改变原函数和调用者行为的情
# 况下来改变原有函数功能
# 小赵写了一个装饰器函数:
def privillage_check(fn):
def fx(name, x):
print("正在检查权限.....")
fn(name, x) #权限通过可以调用相应函数
return fx
# 写一个操作数据的函数(此函数用来示意存钱操作)
@privillage_check
def savemoney(name, x): # 魏老师写的函数,用于存钱
print(name, '存钱', x, '元')
@privillage_check
def withdraw(name, x): # 冯老师写的函数,用于取钱
print(name, '取钱', x, '元')
# ---- 以下是调用者小闵写的程序 -------
savemoney("小张", 200)
savemoney('小赵', 400)
withdraw('小李', 500)
函数的文档字符串
函数内第一次未赋值给任何变量的字符串是此函数的文档字符串
语法:
def 函数名(形参列表):
'''函数的文档字符串'''
函数语句块
示例:
def hello():
'''此函数用来打招呼...
这是函数的文档字符串
'''
pass
>>> help(hello)
说明:
1. 文档字符串通常用来说明本函数的功能和使用方法
2. 在交互模式下,输入:help(函数名) 可以查看函数的文档字符串
函数的 __doc__ 属性
__doc__ 属性用于记录文档字符串
函数的 __name__ 属性
__name__ 用于记录函数的名称
函数的定义语法:
@装饰器1
@装饰器2
...
def 函数名(位置形参, *元组形参(或*), 命名关键字形参, **字典形参):
'''文档字符串'''
语句块