根本约定
ClsX: 类XValx: 变量xFuncx: 函数xCodex: 代码片段x
Python外部对象非凡办法/属性
1.__dict__属性:
ClsA.__dict__,类A的属性字典,包含属性,https://www.cnblogs.com/alvin2010/p/9102344.htmlValA.__dict__, 变量X的属性字典
2.__getattr__(self, item):
# 获取名为item的属性# 默认等同于:return self.__dict__[item]
3.__setattr__(self, item, value):
# 设置名为item的属性值为value# 默认等同于:self.__dict__[item] = value
迭代器和生成器
迭代是Python中遍历拜访汇合元素的一种形式。
迭代器是一个能够记住遍历的地位的对象。
迭代器对象从汇合的第一个元素开始拜访,直到所有的元素被拜访完完结。迭代器只能往前不会后退。
迭代器有两个根本的办法:iter() 和 next()。
https://www.runoob.com/python...
# 假如有个办法,能够依据传入的ID,从服务器获取内容,返回为空的时候阐明没有内容了def get_data(rid): if rid > 5: return return '数据%s' % riddef get_data2(rid): if rid > 3: return return 'Data%s' % rid# 当初咱们须要遍历全副数据i = 1while True: data = get_data(i) if not data: break print(data) i += 1i = 1while True: data = get_data2(i) if not data: break print(data) i += 1# 封装版本def get_all(func): datas = [] i = 1 while True: data = func(i) if not data: break datas.append(data) i += 1 return datasfor data in get_all(get_data): print(data)# 生成器版本def gen_all(func): i = 1 while True: data = func(i) if not data: break yield data i += 1for data in gen_all(func=get_data): print(data)# 迭代器版本class AllGetter: def __init__(self, func): self.func = func self.i = 1 def __iter__(self): return self def __next__(self): data = self.func(self.i) if not data: raise StopIteration self.i += 1 return datax = (i for i in [1,2,3])while True: print(x.__next__()) for data in AllGetter(func=get_data): print(data)x = AllGetter(func=get_data)for data in x: print(data)#等同于it = iter(x) # it = x.__iter__()while True: print(next(it))
装璜器
# 如果咱们须要统计某些函数func1、func2的执行工夫import timedef func1(): time.sleep(1)def func2(): time.sleep(2)t1 = time.time()func1()print('func1', time.time() - t1)t2 = time.time()func2()print('func2', time.time() - t2)# 这类问题可形象为以下:# Code1# FuncX# Code2def func3(a, b): print('a+b', a+b)# 定义函数的做法def timeit(func, *args, **kwargs): t = time.time() func(*args, **kwargs) print(func.__name__, time.time() - t)timeit(func1)timeit(func2)timeit(func3, 1,2)def funcwrap(rawfunc): def _wrap(newfunc): newfunc.__name__ = rawfunc.__name__ return newfunc return _wrap# 装璜器写法def timeit2(func): from functools import wraps def _func(*args, **kwargs): t = time.time() r = func(*args, **kwargs) print(func.__name__, time.time() - t) return r return _func@timeit2def func4(): time.sleep(0.5)# 装璜器左右相似newfunc4 = timeit2(func4)func4 = newfunc4func4(1,2)# 装璜器用于类clzs = []def addit(clz): clzs.append(clz) return clz@additclass A(object): pass@additclass B(object): pass @additclass C(object): passprint(clzs)# 带参数的装璜器def asapi(logined): def _wrap(func): def _func(*args, **kwargs): if logined: print('err') return r = func(*args, **kwargs) return r return _func return _wrap@asapi(logined=True)def fun6(): print('xxx')# 等同于logined = asapi(logined=True)@logineddef fun6(): print('xxx')
上下文管理器
# 某些状况下,咱们须要统计某段代码的执行工夫# 这类问题可形象为以下:# Code1# CodeX# Code2import timedef func1(): x = 2 # 咱们要统计上面这三行代码的执行工夫 a = 1 b = a + x x = 4# 个别做法def func1(): x = 2 st = time.time() a = 1 b = a + x x = 4 print('cost time', time.time()-st)# 上下文治理做法class TimeIt(object): def __enter__(self): self.start = time.time() def __exit__(self, exc_type, exc_val, exc_tb): print('time cost', time.time()-self.start)def func1(): x = 2 with TimeIt(): a = 1 b = a + x x = 4# 等同于def func1(): x = 2 ti = TimeIt() ti.__enter__() a = 1 b = a + x x = 4 ti.__exit__(None,None,None)# 和上下文环境进行交互class TimeIt2(object): def __enter__(self): self.start = time.time() self._marks = [] return self def __exit__(self, exc_type, exc_val, exc_tb): for n, t in self._marks: print(n, t-self.start) print('time cost', time.time()-self.start) def mark(self, name): print('->', name, time.time() - self.start) self._marks.append((name, time.time()))with TimeIt2() as t: 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)# 上下文交互2class SendContext(object): def __init__(self, tag): self.tag = tag def __enter__(self): self.msglist = [] return self.send def __exit__(self, exc_type, exc_val, exc_tb): print(self.msglist) def send(self, userid): self.msglist.append(userid) with SendContext('order') as send: for o in [1,2,3,4]: send(1)