python裝飾器!還能怎麼用?原諒我的孤陋寡聞

2021-10-12 16:12:44 字數 2665 閱讀 6609

裝飾者模式是常用的軟體設計模式之一。通過此設計模式,我們能夠在不修改任何底層**情況下,給已有物件賦予新的職責。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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...