1. 程式人生 > >一個函數裝飾器

一個函數裝飾器

裝飾器

Python的函數是對象

Python 函數可以被賦值def hello():print(‘hello!’)

a = hello #註: 此處沒有() ,是一個對象

a() # 調用a() 結果與hello() 相同

此時刪除 helloa() 依然保持原屬性

技術分享

函數可以定義在另一個函數裏面


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

一個函數裝飾器