Python3 x基礎學習 裝飾器

2022-09-03 14:15:14 字數 4495 閱讀 1059

1.裝飾器函式的本質:乙個閉包函式

2.裝飾器函式的作用:在不修改原函式及其呼叫方式的情況下對原函功能進行擴充套件

3.語法格式: @裝飾器名稱

def

foo():

print('

foo'

)foo()

#

公司有n個部門,每個部門負責相應的業務

deff1():

print("

身份驗證")

print("f1"

)def

f2():

print("

身份驗證")

print("f2"

)def

f3():

print("

身份驗證")

print("f3"

)def

f4():

print("

身份驗證")

print("f4"

)f4()

#身份驗證

#f4

#更改#

defcheck():

print('

身份驗證')

deff1():

check()

print("f1"

)def

f2():

check()

print("f2"

)def

f3():

check()

print("f3"

)def

f4():

check()

print("f4"

)f3()

#身份驗證

#f3

#

開放封閉原則

#封閉:對已經實現的功能**塊,不能輕易修改

#開發:可以對外擴充套件功能

defcheck(f):

definner():

print("

身份驗證")

f()return

inner

@check

deff1():

print("f1"

)@check

deff2():

print("f2"

)#f1()

f2()

def

outter(f):

definner():

print("

---這是內嵌函式---")

f()print('

---在這裡執行完了--')

print("

---外層函式---")

return

inner

@outter

deffunc():

print("

----就看看你想幹哈----")

func()

print(func.__name__)#

---外層函式---

#---這是內嵌函式---

#----就看看你想幹哈----

#---在這裡執行完了--

#inner

import

time

defoutter(f):

definner():

x1 =time.time()

f()x2 =time.time()

x = x2-x1

print("

程式執行了{}秒

".format(x2-x1))

return

inner

@outter

deffunc():

time.sleep(2)

print('

我就想它執行一秒怎麼滴')

func()

#我就想它執行一秒怎麼滴

#程式執行了2.0008254051208496秒

import

time

defoutter(f):

definner():

x1 = time.strftime("

%y-%m-%d %x

",time.localtime())

print

(x1)

f()x2 = time.strftime("

%y-%m-%d %x

", time.localtime())

print

(x2)

return

inner

@outter

deffunc():

time.sleep(2)

print('

我就想它執行一秒怎麼滴')

func()##

2020-04-04/16/20 00:19:08

#我就想它執行一秒怎麼滴

#2020-04-04/16/20 00:19:10

#

多個裝飾器原理

#執行原理:先執行距離函式近的裝飾器

defoutter1(f):

definner1():

print('

-----before inner1-----')

f()print('

--------after inner1----------')

return

inner1

defoutter2(f):

definner2():

print('

-----before inner2-----')

f()print('

--------after inner2----------')

return

inner2

@outter1

@outter2

deffunc():

print("

看看什麼是多個裝飾器,學習學習")

func()##

-----before inner1-----

#-----before inner2-----

#看看什麼是多個裝飾器,學習學習

#--------after inner2----------

#--------after inner1----------

#

帶引數的裝飾器

defoutter(f):

def inner(*args,**kwargs):

print

(args)

print

(kwargs)

f()return

inner

@outter

deffunc():

print("

什麼鬼,還有引數")

func(10,20,name ='

johnson')

#(10, 20)##

什麼鬼,還有引數

def

outter(f):

definner(a,b):

f(a,b)

return

inner

@outter

#func = outter(func)

deffunc(a,b):

print(a+b)

print("

什麼鬼,還有引數")

func(10,20)

print(func.__name__)#

30#什麼鬼,還有引數

#inner

def

outter(f):

definner():

ret =f()

return

ret

return

inner

@outter

deffunc():

print("

臥槽,還有返回值")

return

"臥槽,無情

"func()

print(func()) #

執行inner,inner需要有返回值才能列印,否則就是none

#臥槽,還有返回值

#臥槽,還有返回值

#臥槽,無情

#

使用@wraps(func)解決被裝飾函式的資訊不能檢視問題

from functools import

wraps

defoutter(f):

@wraps(f)

def inner(*args,**kwargs):

f()return

inner

@outter

deffunc():

print("

臥槽,還能用wraps")

func(10,20,name='

johnson')

print(func.__name__)#

臥槽,還能用wraps

#func

Python3 x基礎學習 property

1 property 內建裝飾器函式,把乙個方法呼叫方式變成屬性呼叫方式。將乙個方法當成乙個屬性使用 注意 property裝飾器只能在物件導向中使用 2 訪問使用 property 裝飾器裝飾函式可以直接呼叫函式名 會執行一段功能 函式 然後返回值 3.property裝飾器只能修飾不帶引數的方法...

Python3 x基礎學習 os模組學習

使用os 模組對檔案進行一些相關操作 importos 1.重新命名檔案 os.rename 舊檔名,新檔名 os.rename test.txt test3.txt os.rename test4.txt test 2.刪除檔案 os.remove 檔名 os.remove test1.py 3....

Python3 x基礎學習 閉包函式

在python中建立乙個閉包一般有3個要求 1.閉包函式必須有內嵌函式 2.內嵌函式必須要引用外層函式的變數 3.外部函式返回內嵌函式的位址 函式名稱 判斷是否為閉包函式 closure def outter num definner print num print inner.closure re...