Python裝飾器

2022-08-05 12:00:20 字數 4022 閱讀 9102

開放封閉原則:對拓展是開放的,對修改是封閉的

裝飾器:裝飾他人的工具,裝飾的目的是為他人新增新功能

裝飾器本身是任意可呼叫物件,被裝飾的物件本身也可以是任意可呼叫的物件

裝飾器遵循的原則:1、不修改被裝飾物件的源**

2、不修改被呼叫物件的呼叫方式

裝飾器的目的:在遵循1和2原則的前提下,為其他函式新增新功能

@裝飾器名:必須寫在被裝飾物件的正上方,且是單獨一行

#

author wangmengzhu

import

time

deftimmer(func):

def start =time.time()

func()

stop =time.time()

print('

run time is %s

'%(stop -start))

return

@timmer

defindex():

time.sleep(3)

print('

welcome to index')

index()

import

time

deftimmer(func):

#對於有參和無參都可以傳入

start =time.time()

res = func(*args,**kwargs)

stop =time.time()

print('

run time is %s

'%(stop -start))

return

res

return

@timmer

defindex(name):

time.sleep(3)

print('

%s welcome to index

'%(name))

return

'lala

'res = index('

susu')

print(res)

有參裝飾器

current_user = 

defauth(func):

if current_user['

user']:

res = func(*args, **kwargs)

return

res

else

: name = input('

請輸入你的使用者名稱》:

').strip()

password = input('

請輸入你的密碼》:

').strip()

with open(

'db.txt

', encoding='

utf-8

') as f:

info =f.read()

info_dic =eval(info)

if name in info_dic and password ==info_dic[name]:

res = func(*args, **kwargs)

current_user[

'user

'] =name

return

res

else

:

print('

name or password not exists')

return

@auth

defindex():

print('

from index')

@auth

deffoo(name):

print('

%s welcome to this page

'%(name))

index()

foo(

'egon

')

current_user = 

def deco(auth_type = '

file'):

defauth(func):

if auth_type == '

file':

if current_user['

user']:

res = func(*args, **kwargs)

return

res

else

: name = input('

請輸入你的使用者名稱》:

').strip()

password = input('

請輸入你的密碼》:

').strip()

with open(

'db.txt

', encoding='

utf-8

') as f:

info =f.read()

info_dic =eval(info)

if name in info_dic and password ==info_dic[name]:

res = func(*args, **kwargs)

current_user[

'user

'] =name

return

res

else

:

print('

name or password not exists')

elif auth_type == '

mysql':

pass

else

:

print('

not valid')

return

return

auth

@deco()

defindex():

print('

from index')

@deco()

deffoo(name):

print('

%s welcome to this page

'%(name))

index()

foo(

'egon

')

#

func()

#完整的裝飾-萬能的裝飾

def timmer(qqxing): #

timmer是裝飾器的名字,傳入的引數就是被裝飾的函式

def inner(*args,**kwargs): #

在裝飾器中需要定義一個內部函式

print('

呼叫func之前')

ret = qqxing(*args,**kwargs) #

被裝飾的函式,並且要執行

print('

呼叫func之後')

return

ret

return inner #

將內部函式的名字返回

@timmer

#語法糖 func = timmer(func)

deffunc(name):

print('

%s的公司好老闆好同事好

'%(name))

return 1111111111ret = func('俊傑'

)print('

result : %s

'%ret)

#裝飾器的固定結構

def

def inner(*args,**kwargs):

"""被裝飾函式執行之前要新增的**

"""ret = func(*args,**kwargs)

"""被裝飾函式執行之後要新增的**

"""return

ret

return inner

python迭代器

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是g...

Python 迭代器

概述迭代器是訪問集合元素的一種方式。迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。 延遲計算或惰...

Python迭代器

以直接作用於 for 迴圈的資料型別有以下幾種 一類是集合資料型別,如 list tuple dict set str 等 一類是 generator ,包括生成器和帶 yield 的generator function。 這些可以直接作用於 for 迴圈的物件統稱為可迭代物件 iterable 。...