第八章 函式高階之裝飾器02

2022-05-15 01:29:30 字數 3410 閱讀 2380

目錄

二、有參函式

裝飾器指的是為被裝飾物件新增功能,因此定義裝飾器就是定義乙個函式,只不過是該函式是用來為其他函式新增額外的功能

注意

裝飾器的實現必須遵循兩大原則

第一種傳參方式:

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.方法的實現 呼叫者無需知道方法的具體步驟,只...