裝飾器函式

2021-08-26 23:16:59 字數 2491 閱讀 2118

目錄

一、裝飾器

1、開放封閉原則

2、裝飾器的固定格式:

二、裝飾器的使用

1、無參裝飾器(示例)

2、帶參裝飾器(示例)

3、多個裝飾器裝飾同乙個函式

裝飾器的本質:乙個閉包函式

裝飾器的功能:在不修改原函式及其呼叫方式的情況下對原函式功能進行擴充套件

1.對擴充套件是開放的

為什麼要對擴充套件開放呢?

我們說,任何乙個程式,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許**擴充套件、新增新功能。

2.對修改是封閉的

為什麼要對修改封閉呢?

就像我們剛剛提到的,因為我們寫的乙個函式,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函式的使用者。

裝飾器完美的遵循了這個開放封閉原則。

裝飾器的主要功能和裝飾器的固定結構

裝飾器的主要功能:

在不改變函式呼叫方式的基礎上在函式的前、後新增功能。

def inner(*args,**kwargs):

'''在被裝飾函式之前要做的事'''

ret = f(*args,**kwargs) #被裝飾的函式

'''在被裝飾函式之後要做的事'''

return ret

return inner

def func(a,b): #被裝飾的函式

time.sleep(0.01)

return '新年好'

import time

def timmer(func):

start_time=time.time()

res=func(*args,**kwargs)

stop_time=time.time()

print('run time is %s' %(stop_time-start_time))

return res

@timmer

def foo():

time.sleep(3)

print('from foo')

foo()

def auth(driver='file'):

def auth2(func):

name=input("user: ")

pwd=input("pwd: ")

if driver == 'file':

if name == 'egon' and pwd == '123':

print('login successful')

res=func(*args,**kwargs)

return res

elif driver == 'ldap':

print('ldap')

return auth2

@auth(driver='file')

def foo(name):

print(name)

foo('egon')

有些時候,我們也會用到多個裝飾器裝飾同乙個函式的情況。

def inner():

func()

return inner

def inner():

func()

return inner

def f():

print('in f')

f()

#帶引數的裝飾器

#500個函式

import time

flage = false

def timmer_out(flag):

def timmer(func):

def inner(*args,**kwargs):

if flag:

start = time.time()

ret = func(*args,**kwargs)

end = time.time()

print(end-start)

return ret

else:

ret = func(*args, **kwargs)

return ret

return inner

return timmer

# timmer = timmer_out(flage)

@timmer_out(flage) #wahaha = timmer(wahaha)

def wahaha():

time.sleep(0.1)

print('wahahahahahaha')

@timmer_out(flage)

def erguotou():

time.sleep(0.1)

print('erguotoutoutou')

wahaha()

erguotou()

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...