在学习装饰器之前,先看一下 Python 的一些特性。
1.函数名可作为参数传入
先定义一个函数,用来打印自己的函数名,再定义一个函数来通过把之前函数的函数名作为参数传进去,来调用之前的函数,如下,
def foo():
print('foo')
def bar(func):
func()
>>> bar(foo)
foo
从输出结果可以看到, bar 函数中调用了 foo 的函数实现,即函数名可作为参数传入实现传入函数的功能。
2.装饰器实现
def foo():
print('foo')
def bar(func):
func()
>>> bar(foo)
foo
# -*- coding:utf-8 -*-
"""实现使用一个函数来调用另一个函数"""
def foo0():
print('foo')
def bar0(func):
func()
bar0(foo0) # foo
"""这样就可以再另外的函数里面做一些事"""
def foo1():
print('i am foo')
def bar1(func):
print('hello, '+func.__name__)
func()
bar1(foo1) # hello, foo i am foo
"""实际上这里得到的是一个bar函数,而不是原先的 func 函数了"""
"""所以我们要使用装饰器"""
def foo2():
print('i am foo')
def bar2(func):
def wrapper():
print('hello, ' + func.__name__)
return func()
return wrapper
foo2 = bar2(foo2) # 这里可以使用语法糖来实现, @bar就行了
foo2()
"""函数有参数"""
from functools import wraps
def bar3(func):
@wraps(func)
def wrapper(name):
print('hello, %s' % name)
return func(name)
return wrapper
@bar3
def foo3(name):
print('i am %s' % name)
foo3('xiaoming')
"""带参数的装饰器"""
def bar4(param):
def decorate(func):
def wrapper(name):
if param == 1:
print('hello, %s' % name)
return func(name)
return wrapper
return decorate
@bar4(param=1)
def foo4(name):
print('i am %s' % name)
foo4('xiaohong1')
网友评论