標題,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變量可以改變引用對象類型。