http://www.reibang.com/p/e1d95c4e1697?utm_source=oschina-app
3、call
call方法提供給對(duì)象可以被執(zhí)行的能力魔慷,就像函數(shù)那樣有鹿,而本質(zhì)上,函數(shù)就是對(duì)象央勒,函數(shù)就是一個(gè)擁有call方法的對(duì)象不见。擁有call方法的對(duì)象,使用callable可以得到True的結(jié)果崔步,可以使用()執(zhí)行稳吮,執(zhí)行時(shí),可以傳入?yún)?shù)井濒,也可以返回值灶似。所以我們可以使用call方法來(lái)實(shí)現(xiàn)實(shí)例化對(duì)象作為裝飾器:
檢查一個(gè)函數(shù)的輸入?yún)?shù)個(gè)數(shù), 如果調(diào)用此函數(shù)時(shí)提供的參數(shù)個(gè)數(shù)不符合預(yù)定義,則無(wú)法調(diào)用瑞你。
單純函數(shù)版本裝飾器
def args_num_require(require_num):
def outer(func):
def inner(*args, **kw):
if len(args) != require_num:
print('函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義酪惭,無(wú)法執(zhí)行函數(shù)')
return None
return func(*args, **kw)
return inner
return outer
@args_num_require(2)
def show(*args):
print('show函數(shù)成功執(zhí)行!')
show(1) # 函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義,無(wú)法執(zhí)行函數(shù)
show(1,2) # show函數(shù)成功執(zhí)行!
show(1,2,3) # 函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義者甲,無(wú)法執(zhí)行函數(shù)
檢查一個(gè)函數(shù)的輸入?yún)?shù)個(gè)數(shù),
如果調(diào)用此函數(shù)時(shí)提供的參數(shù)個(gè)數(shù)不符合預(yù)定義春感,則無(wú)法調(diào)用。
實(shí)例對(duì)象版本裝飾器
class Checker:
def init(self, require_num):
self.require_num = require_num
def __call__(self, func):
self.func = func
def inner(*args, **kw):
if len(args) != self.require_num:
print('函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義,無(wú)法執(zhí)行函數(shù)')
return None
return self.func(*args, **kw)
return inner
@Checker(2)
def show(*args):
print('show函數(shù)成功執(zhí)行!')
show(1) # 函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義鲫懒,無(wú)法執(zhí)行函數(shù)
show(1,2) # show函數(shù)成功執(zhí)行!
show(1,2,3) # 函數(shù)參數(shù)個(gè)數(shù)不符合預(yù)定義嫩实,無(wú)法執(zhí)行函數(shù)