Python筆記--裝飾器重載

標題,Phython裝飾器“重載”的說法取自Java方法重載,至於Python世界稱這種語義是什麼,我目前不知道,因爲我纔剛學Python。

裝飾器重載,是指單個裝飾器可用不定參數的多態現象。
(可能說的有點難理解,看下去就知道了)


問題:

寫一個裝飾器wrap,使它可以,

@wrap
def func():
    pass

又可以,

@wrap(arg)
def func()
    pass

(看了問題是不是就知道我說的裝飾器“重載”呢?)

DEMO:

代碼1

#!/usr/bin/python

import functools

def wrap(arg):
    def layer1(func):
        @functools.wraps(func)
        def layer2(arg, **kw):     #雙星的語法還沒見到啊?                        
            return func(arg, **kw) #前路渺茫
        return layer2

    #關鍵在這,判斷arg是否爲函數,然後按實際來改
    #這裏因爲只測試“@wrap”和“@wrap(arg)”,所以比較簡單
    if callable(arg) :
        layer1=layer1(arg) #這裏我就看不懂了,爲什麼一個已定義的
                           #函數名可以該賦值?還是說我小白,不知
                           #道這在Python中很常見。
                           #有必要,真要看看Python的解析器。

    return layer1

@wrap 
    func_a(arg):
        pass

@wrap(arg)
def func_b(arg):
        pass

func_a(arg)
func_b(arg)

上面的只是一種框架,函數名和參數名等都要按實際改


續寫

日期:20170915


因爲我學習Python是亂序看的,今天學回前面一點,知道了Python中,

函數名也是變量,而變量和對象是引用和被引用關係

那麼代碼1,15行中的layer1=layer1(arg)就沒疑問了。

爲了證明上面那句話,我做測試。

測試
代碼2

#!/usr/bin/python
#-*- coding: UTF-8 -*-

a=123
print "a已引用整型123"
print a

a=abs
print "可以改變a的引用對象"
print "a從引用整型變爲引用函數"
print a

print
print "可以直接使用a來調用函數"
print a(-10)

a="str"
print
print "a引用對象改變爲str"
print a

運行

[penx@ali01 python2]$ ./test.py 
a已引用整型123
123

可以改變a的引用對象
a從引用整型變爲引用函數
<built-in function abs>

可以直接使用a來調用函數
10

a引用對象改變爲str
str
[penx@ali01 python2]$

小結:
1.python變量,相當於c語言的void* var。
2.python變量可以改變引用對象類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章