1. 程式人生 > >小白成長之路:初識python(五) --python裝飾器

小白成長之路:初識python(五) --python裝飾器

pytho ret 成了 通過 是把 代碼 rgs 得到 ##

flag = "=======================裝飾器============================="
#定義的裝飾器函數
# def outer(func):
# def inner():
# print(‘加裝飾器‘)
# r = func()
# return r
# return inner
#
# @outer
# def f1():
# print(‘原函數‘)

"""
關於python的裝飾器,其本質也是也一個函數,其參數是一個函數名,作用是在不改變其他函數的代碼的前提下,
為其他函數添加功能
裝飾器的本質是把要增加功能的函數作為函數的參數傳入裝飾器函數,並接受其返回值,本質是已經改變了原來
的函數指向的內存地址,但是在裝飾器函數內部仍然會執行原來函數的功能
具體格式如下:
@outer
def f1():
pass
其中outer為裝飾器函數,其下面的是要修飾的函數
下面進行更具體的解析:
"""

def outer(func):
def inner():
print(‘加裝飾器‘)
r = func()
return r
return inner

@outer
def f1():
print(‘原函數‘)
# print(f1)
# f1()
#先看一下效果,在註釋掉@outer的時候執行f1()的時候得到的結果是
# 原函數
# # 添加裝飾器之後得到的是
# 加裝飾器
# 原函數
"""
我們先來看裝飾器函數,在器內部定義了一個inner函數,在函數從上到下執行的過程中
先將outer函數放入內存,此時的inner函數還沒有放入內存,繼續往下執行,通過@outer
對f1進行裝飾,也就是執行 f1 = outer(f1),此時的f1的指向已經發生了改變,即f1指
向outer函數內部的inner函數,可以通過print(f1)進行測試
# <function f1 at 0x00000196D3AA49D8>
# <function outer.<locals>.inner at 0x000002A0D4704AE8>

此時在執行f1()的時候已經相當於執行inner函數了,那麽原來的f1去了哪裏了?在執行
f1 = outer(f1) 的時候,outer函數的形參func指向f1,在inner函數的內部會執行
func函數,這也就是為什麽f1的指向已經改變了為什麽該能執行一次原來的f1的原因了
"""

##下面說說帶參數的把
"""
f1(),inner(),func()三者的關系如果理解了,那麽參數的問題就很容易了
不管加沒加裝飾器,函數名都是f1,只不過是函數名指向的內存地址發生了變化,
那麽在沒加裝飾器之前,調用f1(1,2) --假設是有兩個參數,為了在加了裝飾器之後調用
f1(1,2) --(因為此時的實質是調用inner(1,2))不報錯,那麽inner函數必須有
和原函數一樣的形參

"""
def outer(func):
def inner(a,b):
print(‘加裝飾器‘)
r = func(a,b)
return r
return inner

@outer
def f1(a,b):
print(a,b)

f1(1,2)

"""
萬能參數也是一樣的道理,只不錯參數變成了 *args,**kwargs
"""

def outer(func):
def inner(*args,**kwargs):
print(‘加裝飾器‘)
r = func(*args,**kwargs)
return r
return inner

@outer
def f1(*args,**kwargs):
print("使用萬能參數")

小白成長之路:初識python(五) --python裝飾器