今天被要求在写代码的时候使用装饰器来查看时间。我看了看我写的代码。classStartDeploy(object):@classmethoddefis_ban_time(cls):now_time=datetime.now().time()time_list=db.get_list('ACTIVITY_TIME:CANNOTDEPOLY')iftime_list:fortime_strintime_list:_,start_time,end_time=time_str.split(',')start_time=datetime.strptime(start_time,'%H:%M:%S').time()end_time=datetime.strptime(end_time,'%H:%M:%S').time()#比较时间ifstart_time<=now_time<=end_time:returnTruereturnFalse@classmethoddefstart_deploy(cls):flag=Trueifcls.is_ban_time():whileflag:input_value=raw_input("The当前时间在禁止上线时间内,是否强制上线(y/n):")ifinput_value.lower()。split()=='y':flag=Falseelifinput_value.lower().split()=='n':返回FalsereturnTrue觉得装饰器确实是个不错的选择,但是有没有办法把我的类改成装饰器呢?记得之前看过一本EffectPython的书,里面提到类装饰器,但是怎么实现都做不到。今天就试试,不想改成函数实现的装饰器。首先类初始化一个对象要经过两步执行__new__构造函数构造一个cls对象和执行__init__初始化一个self对象。也就是说,在创建类的对象之前,我们可以通过重写上面的两个方法来介入,这个创建过程有什么用呢?我们可以在初始化对象的时候传入需要修饰的函数classStartDeploy(object):def__init__(self,func):self.__func=funcdeffunc():print('infunc')OK,那么我们在执行func之前必须检查时间。有没有办法控制执行顺序?python中有很多神奇的方法,包括以下几种:def__call__(self,*args,**kwargs):pass调用对象的方法时,__call__是调用的入口,即我们可以执行任意object方法之前,做一些操作,这里是一个例子classdeco:def__init__(self,func):self.__func=funcdefw(self):print('inw')defprintf(self):print('inprintf')self.w()def__call__(self,*args,**kwargs):self.printf()self.__func()@decodefceshi():print('infunc')ceshi()所以基于以上特性,我们的类装饰器完成了classStartDeploy(object):def__init__(self,func):self.__func=funcdef__call__(self,*args,**kwargs):如果不是self.start_deploy():返回self.__func()@classmethoddefis_ban_time(cls):now_time=datetime.now().time()time_list=db.get_list('ACTIVITY_TIME:CANNOTDePOLY')iftime_list:fortime_strintime_list:_,start_time,end_time=time_str.split(',')start_time=datetime.strptime(start_time,'%H:%M:%S').time()end_time=datetime.strptime(end_time,'%H:%M:%S').time()#比较时间ifstart_time<=now_time<=end_time:returnTruereturnFalse@classmethoddefstart_deploy(cls):flag=Trueifcls.is_ban_time():whileflag:input_value=raw_input("当之前时间在禁止上线时间内,是否强制上线(y/n):")ifinput_value.lower().split()=='y':flag=Falseelifinput_value.lower().split()=='n':returnFalsereturnTrue装饰器相关的内容相当多。以后带参数的装饰器会慢慢更新。多个装饰器嵌套的执行顺序会给类增加装饰器闭包的概念。
