Python __call__详解

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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容