兩個很常見的例項例項看不懂不要緊,過一遍留個印象,
看懂了還看文章作甚
1.在函式上使用裝飾器
# 宣告乙個裝飾器
defdec
(fn)
:defd(
*args,
**kargs)
:print
("dec_d"
)return fn(
*args,
**kagrs)
return d
@dec
deftest()
:print
('test')
test(
)
執行結果如下
dec_d
test
2.在類上使用""
""""
# 宣告乙個裝飾器
defdec
(cls)
:classb1(
):deftest()
:print
("test2"
)return cls.test(
)return b1
@dec
classa(
):deftest()
:print
("test"
)a.test(
)
執行結果如下
test2
test
以上兩個例子中的@dec
就是使用裝飾器
在我個人理解來說@
也是一種賦值的方法,
當@dec
裝飾上去的時候,就已經執行過dec
函式,並把結果給test
了
相當於
# 裝飾器寫法
@dec
deftest()
:pass
# 不要裝飾器寫法
deftest()
:pass
test = dec(test)
所以當你呼叫test()
的時候,此test
已經是dec
返回的d(*args,**kargs)
函式了(不知道*args
和**kargs
是什麼的翻到最後的拓展第一節)
同理,例項2中的class a():
上的直譯器
也相當於
# 裝飾器寫法
@dec
classa(
):pass
# 不要裝飾器寫法
classa(
):pass
a = dec(a)
然後我就試著吧例項1的dec
放到例項2中,
**如下
# 宣告乙個裝飾器
defdec
(cls)
:# cls 和 fn都只是個命名罷了,隨便換
defd
(*args,
**kargs)
:print
("dec_d"
)return d
@dec
classa(
):deftest()
:print
("test")a(
)
然後會發現a()
不再是建立a
的物件了,因為a
已經不是class
了,而是dec
返回的def d
了
同樣是搜尋到的常見的帶引數的裝飾器(類的我就不列舉了)
# 宣告乙個裝飾器
defdecparam
(*dargs,
**dkargs)
:# 同樣是隨意命名 * 不能少
defdec
(fn)
:defd(
*args,
**kargs)
:print
(dargs[0]
)print
(dkargs[
'x']
)print
("dec_d"
)return fn(
*args,
**kagrs)
return d
return dec
@decparam(
1,x=2)
deftest()
:print
('test'
)test(
)
執行結果如下
1
2dec_d
test
不帶參看懂了的很快就會發現
就是在不帶參的dec
函式外面套了乙個decparam
函式
也就是
# 原
@decparam(
1,x=2)
deftest()
:print
('test'
)# 等價
dec = decparam(
1,x=2)
@dec # 這個dec是 decparam 函式執行後返回的,可以拿到 decparam 傳遞的引數
deftest()
:print
('test'
)# 等價
deftest()
:print
('test'
)dec = decparam(
1,x=2)
test = dec(test)
1.引數列表中的*args
和**kargs
*args
表示沒有命名的引數,是個元組
**kargs
表示已經命名了的引數,是個字典
上**
def
test
(x,*a,y,z,
**k)
:print
('x = '
,x)print
('*a = '
,a)print
('y = '
,y)print
('z = '
,z )
print
('**k = '
,k)
test(1,
2,3,y=
4,t=
5,n=
6,s=
7,z=
8)
輸出結果為
x = 1
*a = (2, 3)
y = 4
z = 8
**k =
由此可以看出:
(1).x
為第1個引數所以是1
,
(2).*a
為 其他 沒有命名的引數形成的元組,生成了(2,3)
(3).y
和z
由於都命名了,無論順序,只要*a
和**k
之間就會根據名字自動賦值
(4).**k
剩下的都是我的,現在只剩下沒人要的已命名了,**k
就把它們按照名字 : 值
擺好放進字典
python 帶引數裝飾器
在前面一文 python裡為什麼需要使用裝飾器 decorator 裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的 又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習 為什麼要使用閉包 closu...
python的帶參裝飾器
又是從做鋪墊開始 文件字串 documentation strings def add x,y this is a function for add 函式語塊第一句 一般用三引號 因為習慣是多行的文字 可以使用.doc 訪問 慣例是首寫是大寫字母 return x y print name ndoc...
python函式帶裝飾器 python函式裝飾器
裝飾器 decorators 是python的乙個重要部分。簡單地說 他們是修改其它函式的功能的函式。他們有助於讓我們的 更簡短,也更pythonic。一切皆物件 我們可以將乙個函式賦值給乙個變數 def hi print hihi a hi print a,type a hi 呼叫hi函式,需要加...