函式的重中之重 裝飾器

2022-08-24 02:21:15 字數 2792 閱讀 9461

# 作用:將 l 與 e(e中的名字需要提前定義) 的名字統一

# 應用場景:如果想在被巢狀的函式中修改外部函式變數(名字)的值

# 案例:

def outer():

num = 10

print(num)    # 10

def inner():

nonlocal num

num = 20

p77rint(num)   # 20

inner()

print(num)     # 20

1.不能修改被裝飾物件(函式)的源**(封閉)

2.不能更改被修飾物件(函式)的呼叫方式,且能達到增加功能的效果(開放)

# 把要被裝飾的函式作為外層函式的引數通過閉包操作後返回乙個替代版函式

# 被裝飾的函式:fn

# 外層函式:outer(func) outer(fn) => func = fn

# 替代版函式: return inner: 原功能+新功能

def fn():

print("原有功能")

# 裝飾器

def outer(tag):

def inner():

tag()

print(新增功能")

return inner

fn = outer(fn)

fn()

def outer(f):

def inner():

f()print("新增功能1")

return inner

def wrap(f):

def inner():

f()print("新增功能2")

return inner

@wrap # 被裝飾的順序決定了新增功能的執行順序

@outer # <==> fn = outer(fn): inner

def fn():

print("原有功能")

def check_usr(fn): # fn, login, inner:不同狀態下的login,所以引數是統一的

def inner(usr, pwd):

# 在原功能上新增新功能

if not (len(usr) >= 3 and usr.isalpha()):

print('賬號驗證失敗')

return false

# 原有功能

result = fn(usr, pwd)

# 在原功能下新增新功能

return result

return inner

@check_usr

def login(usr, pwd):

if usr == 'abc' and pwd =='123qwe':

print('登入成功')

return true

print('登入失敗')

return false

# 總結:

# 1.login有引數,所以inner與fn都有相同引數

# 2.login有返回值,所以inner與fn都有返回值

"""inner(usr, pwd):

res = fn(usr, pwd) # 原login的返回值

return res

login = check_usr(login) = inner

res = login('abc', '123qwe') # inner的返回值

def wrap(fn):

def inner(*args, **kwargs):

print('前增功能')

result = fn(*args, **kwargs)

print('後增功能')

return result

return inner

@wrap

def fn1():

print('fn1的原有功能')

@wrap

def fn2(a, b):

print('fn2的原有功能')

@wrap

def fn3():

print('fn3的原有功能')

return true

@wrap

def fn4(a, *, x):

print('fn4的原有功能')

return true

fn1()

fn2(10, 20)

fn3()

fn4(10, x=20)

# 了解

def outer(input_color):

def wrap(fn):

if input_color == 'red':

info = '\033[36;41mnew action\33[0m'

else:

info = 'yellow:new action'

def inner(*args, **kwargs):

pass

result = fn(*args, **kwargs)

print(info)

return result

return inner

return wrap # outer(color) => wrap

color = input('color: ')

@outer(color)               # @outer(color) ==> @wrap # func => inner

def func():

print('func run')

func()

python多重裝飾器詳解

裝飾器是python語言中對於方法的一種包裝形式,可以在不修改被裝飾方法的前提下對該方法進行補充和修改,多重裝飾器的使用順序為 裝飾時順序為從內到外,執行時從外到內 以如下 為例def decorator1 func print before decorated 1 print execute de...

函式裝飾器 類裝飾器

一 函式裝飾函式 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...