裝飾者模式是常用的軟體設計模式之一。通過此設計模式,我們能夠在不修改任何底層**情況下,給已有物件賦予新的職責。python中可以用裝飾器簡單地實現裝飾者模式。
在c/c++中,函式指標可以將函式作為引數傳遞給另一函式。而在python中,函式也是物件的一種,函式可以被引用,也可直接作為引數傳入函式,以及作為容器物件的元素。python中可以採用如下方法實現裝飾者模式:
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
def add(x, y):
result = x+y
return result
def log(func):
result = func(*args)
print(func.__name__,'has been called\n')
return result
if __name__ == '__main__':
print(log(add)(1,2))
上述**中,log
函式以需要被裝飾的函式作為引數,並返回函式物件。被返回的函式的引數為可變引數*args
與**kwargs
(*args
引數會被封裝成tuple
,**kwargs
引數則會被封裝成字典物件),以適應不同函式的不同引數,保證通用性。
上面的實現方法有些繁雜,所有呼叫被裝飾的函式之處的**,都要進行相應修改,自然不符合python簡潔易讀的特性。因此python中給出相應語法糖來增加可讀性和易用性,那便是「裝飾器」。
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
from functools import wraps
def log(func):
#@wraps(func)
result = func(*args)
print(func.__name__,'has been called')
return result
#等價於add = log(add)
@log
def add(x, y):
result = x+y
return result
if __name__ == '__main__':
print(add(1,2))
print(add.__name__)
運**況如下:
>>print(add(1,2))
add has been called
3>>print(add.__name__)
:
>>print(add(1,2))
add has been called
3>>print(add.__name__)
add
orig_add(1,2)
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
import functools
import time
def metric(func):
@functools.wraps(func)
print('decorator1')
f = func(*args,**kv)
return f
def logging(func):
@functools.wraps(func)
print('decorator2')
f = func(*args,**kv)
return f
@metric
@logging
def normalize(name):
sname = name[0:1].upper() + name[1:].lower()
print(sname)
if __name__ == '__main__':
normalize('hello')
運**況如下:
>>normalize('hello')
decorator1
decorator2
hello
decorator2
world
from functools import wraps
def log(text):
def decorator(func):
@wraps(func)
print('%s %s():'%(text,func.__name__))
return func(*args,**kv)
return decorator
@log('run')
def normalize(name):
sname = name[0:1].upper() + name[1:].lower()
print(sname)
normalize = log('run')(normalize)
python用裝飾器和 new
單例模式 乙個類只能有乙個例項,它必須自行向整個系統提供這個例項 裝飾器 對某個功能的包裝 單例模式只允許建立乙個物件,因此節省記憶體,加快物件訪問速度,因此物件需要被公用的場合適合使用,如多個模組使用同乙個資料來源連線物件等等 1 def sing cls,args,kwargs s def ss...
python用類實現裝飾器
利用 call 方法,裝飾器的執行流程 當新增裝飾器語法糖時,會把語法糖的變數名加 執行,並將被裝飾的函式名傳入。所以當類加 執行時,執行了 init 產生的物件就是被裝飾的函式,而物件 執行時觸發 call call方法下就能新增一些新的功能了 import time class timeit d...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...