關於函式定義的單一裝飾器
一般的通用裝飾器
多個裝飾器的使用
帶有引數的裝飾器
類裝飾器
這是裝飾器的自定義和內部機制一些初識
==***先強調裝飾器的要求便是
不改變原來的函式**
裝飾器就乙個函式引用引數
不改變呼叫方式***==
我先介紹一些閉包,因為裝飾器也是基於閉包來實現的,區別閉包和裝飾器的區別就可以看外層函式的產生個數,如果是乙個並且是函式的引用是就可以看出是裝飾器
#閉包
def(num)
:print
("開始執行外部函式"
)def
inner()
:nonlocal num
num+=
10print
(num)
return inner10)
#demo=inner
demo(
)demo(
)
因為我這裡介紹的是裝飾器,閉包就提一下。
import time
deflogging
(func)
:print
("裝飾器"
)def
inner()
: start=time.time(
) func(
) end=time.time(
)print
("時間是%fs"
%(end-start)
)return inner
@logging
defsay()
:print
("我在說話"
)say(
)#相當於inner()
上面的@其實內部過程就是say=logging(say),裝飾過後的say其實變成了inner,這裡可以通過debug去看看
#一般的通用裝飾器就是可以傳入不定長度的引數,還有不管是否返回值,具體見下面的**
defdecorator
(func)
:print
("進入了裝飾器"
)def
inner
(*args,
**kwargs)
:print
("使用不定長度一般話"
) result=func(
*args,
**kwargs)
return result
return inner
@decorator
defadd_num
(num1,num2)
:return num2+num1
@decorator
defadd_three_num
(num1,num2,num3)
:return num1+num2+num3
result=add_num(1,
4)print
("add後%d"
%result)
result=add_three_num(1,
2,3)
print
(result)
def
make_div
(func)
:def
inner
(word)
: word=
""+func(word)+"
"return word
return inner
defmake_p
(func)
:def
inner
(word)
:return
""+func(word)+"
"return inner
@make_div
@make_p
defecho
(word)
:return word
print
(echo(
"我們一起學習,加油!!"
))
帶有引數的裝飾器其實就是在我們上面的裝飾器外部封裝乙個函式,在外面函式傳入引數,關於為啥不能更改我們上面的傳入引數個數,***的**塊會有注釋
注意:-------@express_flag("-"),先執行express_flag("-"),返回decorator,然後執行@decorator
#不能夠像這樣來更改函式make_p(func,parameter2)
#因為我們@decorator的過程是<=>函式名=decorator(函式名)
defexpress_flag
(flag)
:def
decorator
(func)
:def
inner
(a,b)
:if flag==
"-":
print
("我們正在執行減法函式"
)elif flag==
"+":
print
("我們正在執行加法函式"
) func(a,b)
return inner
return decorator
@express_flag(
"-")
defsubtraction
(num1,num2)
:print
("result=%d"
%(num1-num2)
)@express_flag(
"+")
defadd
(num1,num2)
:print
("result=%d"
%(num1+num2)
)add(2,
4)subtraction(1,
3)
這是乙個自定義的使用類來實現裝飾功能的,這裡我先提一下__call__方法
這個方法能夠讓類像函式一樣呼叫
classa(
object):
def__call__
(self,
*args,
**kwargs)
:print
("使用呼叫")a(
)()#這樣寫不太規範 a()表示例項乙個a的物件,然後去呼叫,
其實函式也是使用這個方法來實現呼叫,可以用dict函式看看
這裡介紹這個內建方法是因為下面的**執行@decorate,的內部過程是
say=decorate(say),這樣不就把say變成乙個物件了嗎,後文會出現say()的呼叫方式,為了不報錯,就得使用呼叫物件的方法
class
decorate
(object):
def__init__
(self,func)
: self.__func=func
def__call__
(self, name)
:print
("我能夠多加上功能了"
) self.__func(name)
@decorate
defsay
(name)
:print
("我%s很餓的"
%name)
say(
"小明"
)
因為最近發現以前學的python好多的忘記了,所以來複習一下,後面關於內建的裝飾器像基本的@staticmethod,@classmethod,@property我會後面在更新`>
python 自定義裝飾器 詳解
先看乙個例子 def deco func print before myfunc called.func print after myfunc called.return func deco def myfunc print myfunc called.myfunc deco myfunc 與上面的...
python 自定義裝飾器例項詳解
先看乙個例子 def deco func print before myfunc called.func print after myfunc called.return func deco def myfunc print myfunc called.myfunc deco myfunc 與上面的...
flask利用裝飾器實現自定義路由
當我們使用flask實現restful介面時,並要求對檢視函式做特殊裝飾處理,這時需要我們通過flask利用裝飾器實現自定義路由 softcomaiweb包下 softcomaiweb.py from flask import flask import uuid route index1 metho...