Python __call__详解

2019-04-03  本文已影响0人  harlan_win

https://www.jianshu.com/p/e1d95c4e1697?utm_source=oschina-app

3、call
call方法提供给对象可以被执行的能力,就像函数那样,而本质上,函数就是对象,函数就是一个拥有call方法的对象。拥有call方法的对象,使用callable可以得到True的结果,可以使用()执行,执行时,可以传入参数,也可以返回值。所以我们可以使用call方法来实现实例化对象作为装饰器:

检查一个函数的输入参数个数, 如果调用此函数时提供的参数个数不符合预定义,则无法调用。

单纯函数版本装饰器

def args_num_require(require_num):
def outer(func):
def inner(*args, **kw):
if len(args) != require_num:
print('函数参数个数不符合预定义,无法执行函数')
return None

        return func(*args, **kw)
    return inner
return outer

@args_num_require(2)
def show(*args):
print('show函数成功执行!')

show(1) # 函数参数个数不符合预定义,无法执行函数
show(1,2) # show函数成功执行!
show(1,2,3) # 函数参数个数不符合预定义,无法执行函数

检查一个函数的输入参数个数,

如果调用此函数时提供的参数个数不符合预定义,则无法调用。

实例对象版本装饰器

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('函数参数个数不符合预定义,无法执行函数')
            return None

        return self.func(*args, **kw)
    return inner

@Checker(2)
def show(*args):
print('show函数成功执行!')

show(1) # 函数参数个数不符合预定义,无法执行函数
show(1,2) # show函数成功执行!
show(1,2,3) # 函数参数个数不符合预定义,无法执行函数

上一篇下一篇

猜你喜欢

热点阅读