目錄
二、有參函式
裝飾器指的是為被裝飾物件新增功能,因此定義裝飾器就是定義乙個函式,只不過是該函式是用來為其他函式新增額外的功能
注意:
裝飾器的實現必須遵循兩大原則
第一種傳參方式:
def index():
print('welcome to index')
time.sleep(1)
def time_count(func):
# func = 最原始的index
start = time.time()
func()
end = time.time()
print(f"func time is ")
f = time_count(index)
f()
welcome to index
func time is -1.0008289813995361
下面方式是對第一種的再優化
import time
def index():
print('welcome to index')
time.sleep(1)
def time_count(func):
# func = 最原始的index
start = time.time()
func()
end = time.time()
print(f" time is ")
# f = time_count(index)
# f()
welcome to index
func time is -1.0008289813995361
import time
def index():
print('welcome to index')
time.sleep(1)
return 123
def time_count(func):
# func = 最原始的index
start = time.time()
res = func()
end = time.time()
print(f" time is ")
return res
index = time_count(index)
res = index()
print(f"res: ")
#此處return就已經把原始的index的返回值接收過來了
res = func()
end = time.time()
print(f" time is ")
return res
welcome to index
time is -1.0050289630889893
res: 123
如果原始的home()方法需要傳參,那麼我們之前的裝飾器是無法實現該功能的,由於有timeinner()=home(),所以給timeinner()方法傳參即可。
import time
def home(name):
print(f"welcome to home page")
time.sleep(1)
return name
def time_count(func):
# func = 最原始的index
def timeinner(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(f" time is ")
return res
return timeinner
home = time_count(home)#就相當於把time_count()的函式返回值(其實是內部函式的位址)賦值給另乙個變數名(其實就是被裝飾後的原函式的名字)
res = home('egon')#呼叫了timeinner("egon")
print(f"res: ")
被裝飾的函式正上方單獨寫上@裝飾器名
import time
def time_count(func):
# func = 最原始的index
start = time.time()
func()
end = time.time()
print(f" time is ")
@time_count
def index():
print('welcome to index')
time.sleep(1)
welcome to index
func time is -1.000335454940796
#雙層裝飾器
def deco(func):
res = func(*args,**kwargs)
return res
#三層裝飾器
# 三層裝飾器:給雙層裝飾器加引數
def sanceng (engine):
def outter(func):
#加功能
print(engine)
res = func(*args,**kwargs) #func是被裝飾的函式
return res
return outter
@sanceng('db')
def shopping():
print('shopping')
shopping()
# 三層裝飾器:給雙層裝飾器加引數
def sanceng (engine):
def outter(func):
#加功能
print(engine)
res = func(*args,**kwargs)
print(res)#func是被裝飾的函式
return res
return outter
@sanceng('db')
def shopping(x="666"):
print('shopping')
return x
shopping()
db
shopping
666
第八章 函式高階
在函式宣告和函式定義前加上inline 乙個簡單的計算平方的 include using namespace std inline double square double x int main 內聯函式的使用 函式經常呼叫,函式體較小,不包含迴圈之類的 引用變數的主要用途是用作函式的形參 引用變數...
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章 類的高階
訪問修飾符 公開訪問 用pbulic關鍵字。受保護訪問 用protected關鍵字。預設訪問 沒有訪問。私有訪問 用private關鍵字。封裝 組裝,累的定義 屬性和行為 資訊隱藏 1.訪問修飾符public protected 預設 private 2.方法的實現 呼叫者無需知道方法的具體步驟,只...