函數裝飾器的獨特之處解讀

1.開放封閉性

1.開放封閉性從某種意義上促發了裝飾器的產生。閉包

""" 1.不能修改被裝飾的對象的源代碼 2.不能更改被修飾對象的調用方式,且能達到增長功能的效果 """
例如:

# 1.0版本
def fn():
    print('fn run')


# 2.0版本
def fn():
    print('fn run0')
    print('fn run1')
    print('fn run2')
 fn()

# 修改了源代碼,沒有更改調用方式,對外電泳方式仍是原來的,但功能要有所增長(開放)
# def fn():
#     print('fn run0')
#     print('fn run')
#     print('fn run0')
# fn()

# 更改了調用方式,沒有修改原功能代碼(封閉)
def wrap(fn):
    print('fn run0')
    fn()
    print('fn run2')
wrap(fn)

2.裝飾器

1.什麼是裝飾器和使用裝飾器的好處:函數

"""
裝飾器:就是閉包(閉包場景的一個應用)
        把要裝飾的函數做爲外層函數的參數經過閉包操做後返回一個替代版函數
優勢:
        豐富了原有函數的功能
        提升了程序的拓展性
"""

2.案例:優化

def vase():
    print('插花')


# vase()

# 修改了函數的源代碼
def vase():
    print('插花')
    print('繪畫:進行觀賞')


# vase()

# 修改了函數的調用方式
def wrap(fn):
    vase()
    print('繪畫:進行觀賞')


wrap(vase)


def fn():
    vase()
    print('繪畫:進行觀賞')


vase = fn
vase()


# 函數嵌套結構就是裝飾器
def fnr(tag):
    def fb():
        tag()
        print('繪畫:進行星尚')

    return fb  # 拓展功能後的vase


vase = fnr(vase)

vase()  # 功能添加了,可是它的調用方式

3.爲何要使用裝飾器

    基於第一點的開放封閉性原則,開放封閉原則是咱們在開發過程當中必需要遵照的一個原則。開放封閉指的是對修改封閉,對擴展開放。在之後寫代碼時,須要對一個函數什麼的添加一個新功能時,切記不能修改它的源代碼和它的調用方式。裝飾器即是完徹底全依照了這個原則,咱們添加功能也可使用裝飾器。spa

既然裝飾器遵循開放封閉原則,那麼咱們便要記住在定義裝飾器的時候咱們必須遵照裝飾器的實現原則:1.不能修改被裝飾對象的源代碼  2.不能修改被裝飾對象的調用方式。code

4.裝飾器的簡單模板

def outer(fn):
    def inner(*args,**kwargs):
        result = fn(*args,**kwargs)
        rerurn result
    return inner
function = outer(fn) # 至關於返回了inner函數

function()

5.裝飾器語法糖和他的代碼優化

# 好比:我要在插花的基礎上,在進行賞花的操做
def outer(fn):
    def inner():
        fn()
        print("繪畫:進行觀賞")
    return inner

def wrap(fn):
    def inner():
        fn()
        print('擺放功能')
    return inner

# 語法糖 | 笑笑語法
@wrap
@outer  # <==> vase = outer(vase)
def vase():
    print('插花')
# vase = outer(vase)

vase()int('我要插花!')



'''
 總結:一個函數能夠被任意一個相關裝飾器裝飾,也能夠被任意幾個裝飾器裝飾 注:裝飾的順序會影響新增功能的執行順序
'''

6.運用裝飾器實現的登陸案例

 

# 需求:若是用戶未登陸不能看我的中心或者銷售,不然能夠查看。
is_login = False
def login():
    usr = input('usr:>>>>>')
    if not (len(usr) >= 3 and usr.isalpha()):
        print('驗證失敗')
        return False
    pwd = input('pwd:>>>>>')
    if usr == 'abcd' and pwd == '123qwe':
        print('登陸成功')
        is_login = True
    else:
        print('登陸失敗')
        is_login = False


def check_login(fn):
    def inner(*args,**kwargs):
        # 查看我的主頁,要先登陸
        if is_login != True:
            login()

        # 查看我的主頁或銷售
        result = fn(*args,**kwargs)
        return result
    return inner

@check_login
def home():
    print('我的主頁')

@check_login
def sell():
    print('能夠銷售')=============================================>>> 輸出結果爲:登陸成功      我的主頁=============================================>>>
相關文章
相關標籤/搜索