-
先复习下函数参数的内容:
a. 可变参数
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum // 调用该函数时,可以传入任意个参数,包括0个参数: >>> calc() 0 >>> calc(1, 2) 5 >>>
b. 关键字参数
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) 函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以 只传入必选参数: >>> person('Michael', 30) name: Michael age: 30 other: {} 也可以传入任意个数的关键字参数: >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
如果函数的参数定义是(*args, **kw),表示该函数可以接受任意参数的调用。
-
增强下涉及 *args **kwargs 的函数调用
def business(a): print "In the business---" print a print "end of the business---" def test(*args, **kwargs): print "In the test" print args print kwargs business(*args, **kwargs) print "end of test" test("rob") args = (1,) kwargs = {} business(*args, **kwargs) 运行结果: In the test ('rob',) {} In the business--- rob end of the business--- end of test In the business--- 1 end of the business---
-
装饰器:本质上是返回函数的高阶函数
def my_decorator(func): print "In the my_decorator" def wrapper(*args, **kwargs): // 如果函数的参数定义是(*args, **kw),表示该函数可以接受任意参数的调用 print "In the wrapper" func(*args, **kwargs) print "end of the wrapper" return wrapper @my_decorator def businessA(a): print "In the businessA---" print a print "end of the businessA---" businessA("cheng") 运行结果: In the my_decorator In the wrapper In the businessA--- cheng end of the businessA--- end of the wrapper
把 @my_decorator 放到 businessA 函数的定义处,相当于执行了语句:
businessA = my_decorator(businessA)
由于 my_decorator() 是一个decorator,返回一个函数,
所以,原来的 businessA()函数仍然存在,只是现在同名的 businessA 变量指向了新的函数,
于是调用 businessA() 将执行新函数,即在 my_decorator()函数中返回的wrapper()函数。wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。
在wrapper()函数内,首先打印日志,再紧接着调用原始函数。
Python 装饰器精讲
于 2022-10-13 17:21:12 首次发布