BasicConventionClsX:ClassXValx:VariablexFuncx:FunctionxCodex:CodeFragmentxPythonInternalObjectSpecialMethods/Attributes1.__dict__属性:ClsA.__dict__,类A的属性字典,包括属性,https://www.cnblogs.com/alvin2010/p/9102344.htmlValA.__dict__,变量X的属性字典2.__getattr__(self,item):#获取名为item的属性#默认等价于:returnself。__dict__[item]3.__setattr__(self,item,value):#设置名为item的属性值为value#默认相当于:self.__dict__[item]=valueIterator和generatoriteration是Python中迭代的一种方式通过集合的元素。迭代器是一个记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到访问完所有元素。迭代器只能前进不能后退。迭代器有两个基本方法:iter()和next()。https://www.runoob.com/python...#假设有一个方法可以根据传入的ID从服务器获取内容,如果返回为空,说明没有内容。defget_data(rid):ifrid>5:returnreturn'Data%s'%riddefget_data2(rid):ifrid>3:returnreturn'Data%s'%rid#现在我们需要遍历所有数据i=1whileTrue:data=get_data(i)如果不是data:breakprint(data)i+=1i=1whileTrue:data=get_data2(i)如果不是data:breakprint(data)i+=1#packageversiondefget_all(func):datas=[]i=1whileTrue:data=func(i)ifnotdata:breakdatas.append(data)i+=1returndatasfordatainget_all(get_data):print(data)#生成器版本defgen_all(func):i=1whileTrue:data=func(i)ifnotdata:breakyielddatai+=1fordataingen_all(func=get_data):print(data)#迭代器版本类AllGetter:def__init__(自我,功能):自我。函数=函数自身。i=1def__iter__(self):returnselfdef__next__(self):data=self.func(self.i)如果不是数据:raiseStopIterationself.i+=1returndatax=(iforiin[1,2,3])whileTrue:print(x.__next__())fordatainAllGetter(func=get_data):print(data)x=AllGetter(func=get_data)fordatainx:print(data)#equivalenttoit=iter(x)#it=x.__iter__()whileTrue:print(next(it))decorator#如果我们需要统计一些函数func1和func2的执行时间importtimedeffunc1():time.sleep(1)deffunc2():time.sleep(2)t1=time.time()func1()print('func1',time.time()-t1)t2=time.time()func2()print('func2',time.time()-t2)#这类问题可以抽象如下:#Code1#FuncX#Code2deffunc3(a,b):print('a+b',a+b)#如何定义一个函数deftimeit(func,*args,**kwargs):t=time.time()func(*args,**kwargs)print(func.__name__,time.time()-t)timeit(func1)timeit(func2)timeit(func3,1,2)deffuncwrap(rawfunc):def_wrap(newfunc):newfunc.__name__=rawfunc.__name__returnnewfuncreturn_wrap#装饰器写法deftimeit2(func):fromfunctoolsimportwrapsdef_func(*args,**kwargs):t=time.time()r=func(*args,**kwargs)print(func.__name__,time.time()-t)returnrreturn_func@timeit2deffunc4():time.sleep(0.5)#装饰器类似于newfunc4=timeit2(func4)func4=newfunc4func4(1,2)#装饰器是用于类clzs=[]defaddit(clz):clzs.append(clz)returnclz@additclassA(object):pass@additclassB(object):pass@additclassC(object):passprint(clzs)#Decoration带有参数实现者defasapi(logined):def_wrap(func):def_func(*args,**kwargs):如果登录:print('err')returnr=func(*args,**kwargs)returnrreturn_funcreturn_wrap@asapi(logined=True)deffun6():print('xxx')#相当于loggedin=asapi(logined=True)@logineddeffun6():print('xxx')contextmanager#有些情况,我们需要统计某段代码的执行时间#此类问题可以抽象为:#Code1#CodeX#Code2importtimedeffunc1():x=2#我们要统计下面三行代码的执行时间a=1b=a+xx=4#一般做法deffunc1():x=2st=time.time()a=1b=a+xx=4print('costtime',time.time()-st)#上下文管理实践类TimeIt(object):def__enter__(self):self.start=time.time()def__exit__(self,exc_type,exc_val,exc_tb):print('timecost',time.time()-self.start)deffunc1():x=2withTimeIt():a=1b=a+xx=4#相同asdeffunc1():x=2ti=TimeIt()ti.__enter__()a=1b=a+xx=4ti.__exit__(None,None,None)#与上下文类TimeIt2(object)交互:def__enter__(self):self.start=time.time()self._marks=[]returnselfdef__exit__(self,exc_type,exc_val,exc_tb):对于n,tinself._marks:print(n,t-self.start)print('timecost',time.time()-self.start)defmark(self,name):print('->',name,time.time()-self.start)self._marks.append((name,time.time()))withTimeIt2()ast:time.sleep(2)t.mark('T1')time.sleep(1)t.mark('T2')time.sleep(0.5)#等同于ti=TimeIt2()t=ti.__enter__()time.sleep(2)t.mark('T1')time.sleep(1)t.mark('T2')time.sleep(0.5)ti.__exit__(None,None,None)#上下文交互2classSendContext(object):def__init__(self,tag):self.tag=tagdef__enter__(self):self.msglist=[]returnself.senddef__exit__(self,exc_type,exc_val,exc_tb):print(self.msglist)defsend(self,userid):self.msglist.append(userid)withSendContext('order')作为发送:对于[1,2,3,4]中的o:发送(1)
