軟件面世時,不可能把全部的功能都設計好,當前的將來一兩年功能給你上線,按期更新迭代。對於軟件以前的寫的源代碼通常都不會修改,對函數裏面的代碼以及函數的調用方式。python
開放原則
:在源碼不改變的狀況下,增長一些額外的功能。app
def warpper(f):#裝飾器名 def inner(*args,**kwargs): #被裝飾以前執行的操做 ret=f(*args,**kwargs)#執行原函數 #被裝飾以後執行的操做 return ret#原函數的返回值 return inner @warpper#func=warpper(func) def func(): print(1)
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()
# 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()