1.裝飾器函式的本質:乙個閉包函式
2.裝飾器函式的作用:在不修改原函式及其呼叫方式的情況下對原函功能進行擴充套件
3.語法格式: @裝飾器名稱
deffoo():
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()
defoutter(f):
definner():
print("
---這是內嵌函式---")
f()print('
---在這裡執行完了--')
print("
---外層函式---")
return
inner
@outter
deffunc():
print("
----就看看你想幹哈----")
func()
print(func.__name__)#
---外層函式---
#---這是內嵌函式---
#----就看看你想幹哈----
#---在這裡執行完了--
#inner
importtime
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秒
importtime
defoutter(f):
definner():
x1 = time.strftime("
%y-%m-%d %x
",time.localtime())
(x1)
f()x2 = time.strftime("
%y-%m-%d %x
", time.localtime())
(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):
(args)
(kwargs)
f()return
inner
@outter
deffunc():
print("
什麼鬼,還有引數")
func(10,20,name ='
johnson')
#(10, 20)##
什麼鬼,還有引數
defoutter(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
defoutter(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...