python 裝飾器 dec 帶參與不帶參用法

2021-10-03 17:42:41 字數 3893 閱讀 9654

兩個很常見的例項例項看不懂不要緊,過一遍留個印象,

看懂了還看文章作甚

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)

然後我就試著吧例項1dec放到例項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).yz由於都命名了,無論順序,只要*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函式,需要加...