视频链接https:zhuanlan。zhihu。comp562586782 什么是魔法函数? 是以双下划线开头和双下划线结尾命名的特殊函数,不需要开发者调用,由Python解释器调用。 可调用对象的概念:在python中,能够使用名称加()执行的对象都是可调用对象。 很显然所有的函数都是可调用对象,那么类实例对象是调用对象吗? 实验下: 报错了,错误信息提示Student对象不是一个可调用对象。 检测一个对象是否可调用还可以使用callable函数。 返回False,也说明了Student对象不是一个可调用对象。 那么这么才能拿让类实例对象变成可调用对象呢? 只要类实现了魔法函数call即可,我们试下。 很明显实现了call之后,Student对象变成了可调用对象; 其中call不需要要开发者来调用,它属于特殊函数,解释器会去调用的。 为什么要将了转化成可调用对象呢?哪些场景使用? 可调用对象,让类实例对象能够像函数一样接收参数,好处是更加简洁,不需要使用对象。方法()。 使用场景: 1。在一些验证器中使用,举个例子: importre classPhoneValidator(): DEC:手机号格式合法验证器 defcall(self,args,kwargs): reg1(3〔09〕4〔5,7〕5〔0,1,2,3,5,6,7,8,9〕6〔2,5,6,7〕7〔0,1,7,8〕8〔09〕9〔1,8,9〕)d{8}39; phoneargs〔0〕 ifnotre。match(reg,phone): print(phoneisvalidate。) else: print(phoneisinvalidate。) phonevalidatorPhoneValidator() phonevalidator(13735468254) phonevalidator(10735468254) 结果: phoneisinvalidate。 phoneisvalidate。 你可能会为那为什么不使用函数呢?类有更好的扩展性,你可能还需要做其他的事情呢? 所以我们需要的是函数但是又不仅仅只是函数。 2。在类装饰器中使用,在装饰器章节详细看下类装饰器。 描述:虽然装饰器是用类实现的,但是最终用来替换原函数的对象,仍然是一个处在call方法里的闭包函数 importtime importrandom fromfunctoolsimportwraps classTimer: 装饰器:打印函数的耗时 :paramprintargs:是否打印发发那个发名和参数,默认为False definit(self,printargs): self。printargsprintargs defcall(self,func): wraps(func) defdecorated(args,kwargs): desc:jdhfksjdf param:args, sttime。perfcounter() retfunc(args,kwargs) ifself。printargs: print(f{func。name},args:{args},kwargs:{kwargs}) print(timecost:{}seconds。format(time。perfcounter()st)) returnret returndecorated Timer(printargsTrue) defrandomsleep(): print(random) ifnamemain: randomsleep()