無參裝飾器

2022-08-16 03:21:17 字數 4163 閱讀 6933

def index(x,y):

print(x,y)

index(*args,**kwargs) #

# index(y=222,x=111)

# 可以把函式當做引數傳入

# 可以把函式當做返回值返回

def index():

return 123

def foo(func):

return func

foo(index)

def outter(func):

pass

def outter():

x=111

xf=outter()

傳參的方式一:通過引數的形式為函式體傳值

print(1)

print(2)

print(3)

x傳參的方式二:通過閉包的方式為函式體傳值

def outter(x):

# x=1

print(1)

print(2)

print(3)

x# f1=outter(1)

# f2=outter(2)

# f3=outter(3)

開放封閉原則
# 需求:在不修改index函式的源**以及呼叫方式的前提下為其新增統計執行時間的功能

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

index(111,222)

# index(y=111,x=222)

# index(111,y=222)

#### 解決方案一:失敗

#### 問題:沒有修改被裝飾物件的呼叫方式,但是修改了其源**

```python

import time

def index(x,y):

start=time.time()

time.sleep(3)

print('index %s %s' %(x,y))

stop = time.time()

print(stop - start)

index(111,222)

#### 解決方案二:失敗

#### 問題:沒有修改被裝飾物件的呼叫方式,也沒有修改了其源**,並且加上了新功能但是**冗餘

```python

import time

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

#### 解決方案三:失敗

#### 問題:解決了方案二**冗餘問題,但帶來乙個新問題即函式的呼叫方式改變了

```python

import time

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

#### 方案三的優化一:將index的引數寫活了

```python

import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

start=time.time()

index(*args,**kwargs) # index(3333,z=5555,y=44444)

stop=time.time()

print(stop - start)

方案三的優化二:在優化一的基礎上把被裝飾物件寫活了,原來只能裝飾index
import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

def outter(func):

# func = index的記憶體位址

start=time.time()

func(*args,**kwargs) # index的記憶體位址()

stop=time.time()

print(stop - start)

home('egon')

# home(name='egon')

import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

def outter(func):

start=time.time()

res=func(*args,**kwargs)

stop=time.time()

print(stop - start)

return res

home=outter(home)

print('返回值--》',res)

import time

# 裝飾器

def timmer(func):

start=time.time()

res=func(*args,**kwargs)

stop=time.time()

print(stop - start)

return res

# 在被裝飾物件正上方的單獨一行寫@裝飾器名字

# @timmer # index=timmer(index)

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

# @timmer # home=timmer(ome)

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

index(x=1,y=2,z=3)

home('egon')

def index():

pass

def outter(func):

# 1、呼叫原函式

# 2、為其增加新功能

res=func(*args,**kwargs)

return res

# 案例:

def auth(func):

# 1、呼叫原函式

# 2、為其增加新功能

name = input('your name>>: ').strip()

pwd = input('your password>>: ').strip()

if name == 'egon' and pwd == '123':

res = func(*args, **kwargs)

return res

else:

print('賬號密碼錯誤')

@auth

def index():

print('from index')

index()

無參裝飾器函式和帶參裝飾器函式

python裝飾器 下邊幾個裝飾器帶引數和不帶引數例子詳解 我們都知道,python中函式是可以被當做引數進行傳遞的,所以最直接的裝飾器例項如下 def decorator func 裝飾器函式 print welcome func print end def test print hello wo...

python裝飾器 有殘裝飾器 無參裝飾器

裝飾器 修飾別人的工具,修飾新增功能,工具指的是函式 裝飾器本身可以是任何可呼叫物件,被裝飾的物件也可以是任意可呼叫物件 為什麼要用裝飾器 開放封閉原則 對修改是封閉的,對擴充套件是開放的 裝飾器就是為了在不修改被裝飾物件的源 以及呼叫方式的前提下,為期新增新功能 基本裝飾器 usr bin pyt...

Day17 無參裝飾器

一 無參裝飾器 1 什麼是裝飾器 器指的是工具,可以定義成成函式,裝飾指的是為其他事物新增額外的東西點綴 合到一起的解釋 裝飾器指的定義乙個函式,該函式是用來為其他函式新增額外的功能 2 為何要用裝飾器 開放封閉原則 開放 指的是對拓展功能是開放的 封閉 指的是對修改源 是封閉的 裝飾器就是在不修改...