装饰器概念
装饰器是一个闭包,即输入一个函数类型的参数并返回一个替代的函数。可以用于拓展原来函数功能,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
格式
def outer(func):
def inner(*args, **kwargs):
pass
func(*args, **kwargs)
return inner
@outer
def funct(args1, args2, ..., argsN):
pass
简单的装饰器
使用f接收装饰器outer返回的经过扩展的函数inner。
def func():
print("Hello World!")
def outer(func):
def inner():
print("********************")
func()
return inner
f = outer(func)
复杂装饰器
def say(name, age):
print("Hello, My name is %s, I'm %d years old!" % (name, age))
def outer(func):
def inner(name, age):
print("**************************")
func(name, age)
return inner
say = outer(say)
say(name, age)
使用@outer作用于函数,可以替代say = outer(say)语句,相当于函数定义时就被装饰器扩展。
def outer(func):
def inner(name, age):
print("**************************")
func(name, age)
return inner
@outer
def say(name, age):
print("Hello, My name is %s, I'm %d years old!" % (name, age))
say(name, age)
在outer装饰器中,若inner和func的参数为(*args, **kwargs)则代表可以被接收的任意参数列表。这样使得该装饰器对所有的功能函数都通用。
偏函数概念
偏函数是将原函数重新设定部分或全部参数的缺省值后,得到的新函数。它与原函数的区别仅在于参数缺省值不同。
一个自定义的偏函数int2的例子如下:
def int2(str, base = 2):
return int(str, base)
print(int("1011")) # 调用原函数(默认十进制)返回int类型的1011
print(int2("1011")) # 调用偏函数返回int类型的11
python提供一个生成偏函数的模块。通常,通过functools模块定义偏函数,可以简化代码。
import functools
int2 = functools.partial(int, base = 2) # int参数代表原函数名,base = 2代表需要更改缺省值的表达式
print(int2("1011")) # 偏函数默认2进制,结果返回11