一個函數裝飾器
Python的函數是對象
Python 函數可以被賦值def hello():–print(‘hello!’)
a = hello #註: 此處沒有() ,是一個對象
a() # 調用a() 結果與hello() 相同
此時刪除 hello,a() 依然保持原屬性
函數可以定義在另一個函數裏面
def say():
def hello():
return ‘hello‘
return hello
外層的say函數會把內層的 hello函數的執行結果輸出
函數可以返回一個函數
可以將一個函數當作參數傳遞
書寫一個裝飾器
def oneDecorator(oneFunction):
def oneWrapper():
print ‘before’
oneFunction()
print ‘after’
return oneWrapper
def sayHello():
print ‘hello’
run = oneDecorator(sayHello)
run()
示例1
示例2
裝飾器經典模式à累加裝飾器
上例通過函數直接調用可寫成
run = towDecorator(oneDecorator(sayHello))
註:被裝飾的函數不寫括號,代表返回的是一個對象,然後通過對象()的方式運行
run()
裝飾器傳遞參數
只需要讓包裝函數傳遞參數即可
def oneDecoration(oneFunction):
def wrapper(arg1, arg2):
print(‘=’ * 50)
oneFunction(arg1, arg2)
print(‘=’ * 50)
return wrapper
示例
使用裝飾器裝飾一個類中的方法
構建裝飾器的時候,需要考慮self,所以在傳參的時候,包裝函數除了需要傳遞函數的參數,還要傳遞一個self參數
例:
def oneDecration(onefunction):
def wrapper(self, args1, args2):
print(‘=’* 50)
oneFunction(self, args1, args2)
print(‘=’ * 50)
return wrapper
其它與上例無異,這裏不再作演示
一個更為通用的裝飾器
def oneDecration(onefunction):
def wrapper(*args, **kwargs):
print(‘=’ * 50)
oneFunction(*args, **kwargs)
print(‘=’ * 50)
return wrapper
@oneDecration
def sayHello(name1, name2, name3):
print(‘{}: hello, {}, {}’.format(name1,name2,name3))
@oneDecration
def sayHello1():
print(‘hello’)
sayHello1()
sayHello(‘Tom’,‘Jerry’, ‘Jim’)
裝飾器一般格式
import functools
def 裝飾器名(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
dosomething
fun(*args, **kwargs)
return wrapper
本文出自 “騎豬去旅行” 博客,請務必保留此出處http://songqinglong.blog.51cto.com/7591177/1959364
一個函數裝飾器