python裝飾器

1開放封閉原則

軟件面世時,不可能把全部的功能都設計好,當前的將來一兩年功能給你上線,按期更新迭代。對於軟件以前的寫的源代碼通常都不會修改,對函數裏面的代碼以及函數的調用方式。python

開放原則:在源碼不改變的狀況下,增長一些額外的功能。app

  1. 封閉原則: 不要改變源碼。
  2. 開放原則:更新增長一些額外的功能。
  3. python中裝飾器:完美的詮釋的開放封閉原則。
  4. 裝飾器就是一個函數: 他要裝飾一個函數,在不改變原函數的源碼以及調用方式的前提下,給其增長一個額外的功能。

2.標準裝飾器

def warpper(f):#裝飾器名
    def inner(*args,**kwargs):
        #被裝飾以前執行的操做
        ret=f(*args,**kwargs)#執行原函數
        #被裝飾以後執行的操做
        return ret#原函數的返回值
    return inner
@warpper#func=warpper(func)
def func():
    print(1)

3.帶參數的裝飾器

def warrper_out(n):#最外層傳入參數
    def warrper(f):#標準裝飾器寫法
        def inner(*args,**kwargs):
            with open(n,mode="r",encoding="utf-8")as f1:#這裏的n就是調用的傳進來的參數
                dic={}
                for i in f1:
                    i=i.strip().split("|")
                    dic[i[0]]=i[1]
                username=input("name:").strip()
                psw=input("psw:").strip()
                if dic.get(username) and psw==dic[username]:
                    ret=f(*args,**kwargs)
                else:
                    print("失敗")
            return ret
        return inner
    return warrper
@warrper_out("qq")
# 1. 執行wrapper_out('qq') 這個函數,把相應的參數'qq' 傳給 n,而且獲得返回值 wrapper函數名。
# 2. 將@與wrapper結合,獲得咱們以前熟悉的標準版的裝飾器按照裝飾器的執行流程執行。
def qq():
    print("歡迎登陸qq")
qq()
@warrper_out("dy")
def dy():
    print("歡迎來到抖音")
dy()

4.兩個裝飾器裝飾一個函數

# def wrapper1(func1):  # func1 = f原函數
#     def inner1():
#         print('wrapper1 ,before func')  # 2
#         func1()
#         print('wrapper1 ,after func')  # 4
#     return inner1
#
# def wrapper2(func2):  # func2 == inner1
#     def inner2():
#         print('wrapper2 ,before func')  # 1
#         func2()  # inner1
#         print('wrapper2 ,after func')  # 5
#     return inner2
#
#
# @wrapper2  # f = wrapper2(f) 裏面的f == inner1  外面的f == inner2
# @wrapper1  # f = wrapper1(f) 裏面的f == func1  外面的 f == inner1
# def f():
#     print('in f')  # 3
#這裏也能夠理解爲wrapper2裝飾了wrapper1,因此其中的func2至關於wrapper1
#wrapper1裝飾了原函數f,wrapper1中的func1就是原函數
#
# f()  # inner2()
相關文章
相關標籤/搜索