python3裝飾器個人總結

2021-09-05 11:39:58 字數 3926 閱讀 9747

什麼是裝飾器?

裝飾器是一種設計模式,可以在不改變原來函式的基本功能的基礎上,給原來的函式新增一些修飾的功能,作用是:可以降低**的耦合度

裝飾器的本質就是乙個閉包,把乙個函式作為引數

被裝飾函式本身變成了裝飾函式

被裝飾函式名__name__也變成了裝飾函式的name名

簡單的計算時間的裝飾器

import time

​def timer(func):

def wrap(*args,**kwargs):

t1 = time.clock()

result = func(*args,**kwargs)

t2 = time.clock()

print(t2)

return result

return wrap

​@ timer

def foo(n):

x =1

for i in range(1,n+1):

x *=i

return x

a = foo(100)

print(foo(100))​​

被裝飾函式本身變成了裝飾函式

被裝飾函式名__name__也變成了裝飾函式的name名

​in [53]: foo

out[53]: .wrap>

​in [52]: foo.__name__

out[52]: 'wrap'

裝飾器類

import time

​class b:

def __init__(self,func):

self.func = func

​   def __call__(self,*args,**kwargs):

t1 = time.clock()

result = self.func(*args,**kwargs)

t2 = time.clock()

print(t2)

return result​@b

def foo(n):

x = 1

for i in range(1,n+1):

x *=i

return x

​res = foo(10)

print(res)

多層裝飾器

import time

# 多層裝飾器

​def deco1(func):

print("exec deco1")

def wrap1(*args,**kwargs):

print("執行了wrap1")

res = func(*args,**kwargs)

print("exit wrap1")

return res

print("退出了deco1")

return wrap1

​def deco2(func):

print("exec deco2")

def wrap2(*args,**kwargs):

print("執行了wrap2")

res = func(*args,**kwargs)

print("exit wrap2")

return res

print("退出了deco2")

return wrap2

​def deco3(func):

print("exec deco3")

def wrap3(*args,**kwargs):

print("執行了wrap3")

res = func(*args,**kwargs)

print("exit wrap3")

return res

print("退出了deco3")

return wrap3​​

@deco1

@deco2

@deco3

def foo(x,y):

return x**y

​print("裝飾過程結束")

print(foo)

​n = foo(3,4)

​print(n)​​

'''#執行過程:

exec deco3

退出了deco3

exec deco2

退出了deco2

exec deco1

退出了deco1

裝飾過程結束

.wrap1 at 0x000002403cc93d90>

​執行了wrap1

執行了wrap2

執行了wrap3

exit wrap3

exit wrap2

exit wrap1

81'''

'''其實這個裝飾過程,就是先執行了deco3(因為離的近),deco3執行完了後,foo已經變成了wrap3,這時開始執行deco2,deco2接收到的是wrap3,然後又將wrap3變成了wrap2,然後deco1開始執行這時又將wrap2變成了wrap1

wrap1執行,呼叫了wrap2,wrap2又呼叫了wrap3,wrap3執行完,又依次返回

'''

帶參裝飾器

import time

​def timer(run_times):

def warp1(func):

def warp2(*args,**kwargs):

st = time.clock()

st1 = time.time()

for i in range(run_times):

result = func(*args,**kwargs)

et = time.clock()

et2 = time.time()

t3 = et2-st1

print("et為:{}".format(et))

print("t3為:{}".format(t3))

return result

return warp2

return warp1​​

@timer(100)

def jiechen(n):

x = 1

for i in range(1,n+1):

x *=i

return x

​jiechen(1000)

retry 裝飾器

import time

import random

​class retry(object):

def __init__(self, max_retries=3, wait=0, exceptions=(exception,)):

self.max_retries = max_retries

self.exceptions = exceptions

self.wait = wait

​   def __call__(self, func):

for i in range(self.max_retries + 1):

try:

result = func(*args, **kwargs)

except self.exceptions:

print("retey..")

time.sleep(self.wait)

continue

else:

return result

@retry(3,1,(valueerror))

def foo():

n = random.randint(-10,10)

if n>=0:

return n

else:

raise valueerror('n<0')

print(foo())

python3 深入裝飾器

def outer c def inner uname print 我是 end c uname return inner outer def fun 1 uname print f 北京的 fun 1 mike def outer c def inner args,kwargs 通用的形參的設定 ...

Python3 高階 裝飾器

1.裝飾器功能 在不修改原函式的情況下,增強函式功能 2.不帶引數的函式 不帶引數的裝飾器 1 foo 被裝飾的函式 2 show time 是裝飾器 coding utf 8 import time def show time func def inner start time time.time...

python3裝飾器 高階

作用 優化裝飾器 from functools import wraps 匯入wraps def wraps f wraps的語法糖 def inner args,kwargs ret f args,kwargs return ret return inner deff1 print hello,w...