在學(xué)習(xí)裝飾器之前躲撰,先看一下 Python 的一些特性门粪。
1.函數(shù)名可作為參數(shù)傳入
先定義一個(gè)函數(shù)赴背,用來(lái)打印自己的函數(shù)名铣焊,再定義一個(gè)函數(shù)來(lái)通過(guò)把之前函數(shù)的函數(shù)名作為參數(shù)傳進(jìn)去逊朽,來(lái)調(diào)用之前的函數(shù),如下曲伊,
def foo():
print('foo')
def bar(func):
func()
>>> bar(foo)
foo
從輸出結(jié)果可以看到叽讳, bar 函數(shù)中調(diào)用了 foo 的函數(shù)實(shí)現(xiàn),即函數(shù)名可作為參數(shù)傳入實(shí)現(xiàn)傳入函數(shù)的功能熊昌。
2.裝飾器實(shí)現(xiàn)
def foo():
print('foo')
def bar(func):
func()
>>> bar(foo)
foo
# -*- coding:utf-8 -*-
"""實(shí)現(xiàn)使用一個(gè)函數(shù)來(lái)調(diào)用另一個(gè)函數(shù)"""
def foo0():
print('foo')
def bar0(func):
func()
bar0(foo0) # foo
"""這樣就可以再另外的函數(shù)里面做一些事"""
def foo1():
print('i am foo')
def bar1(func):
print('hello, '+func.__name__)
func()
bar1(foo1) # hello, foo i am foo
"""實(shí)際上這里得到的是一個(gè)bar函數(shù)绽榛,而不是原先的 func 函數(shù)了"""
"""所以我們要使用裝飾器"""
def foo2():
print('i am foo')
def bar2(func):
def wrapper():
print('hello, ' + func.__name__)
return func()
return wrapper
foo2 = bar2(foo2) # 這里可以使用語(yǔ)法糖來(lái)實(shí)現(xiàn)湿酸, @bar就行了
foo2()
"""函數(shù)有參數(shù)"""
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')
"""帶參數(shù)的裝飾器"""
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')