一 有参装饰器

>带有参数的函数装饰器

为被装饰对象添加认证功能的装饰器,实现的基本形式如下

def deco(func):def wrapper(*args,**kwargs):编写基于文件的认证,认证通过则执行res=func(*args,**kwargs),并返回resreturn wrapper

如果想提供多种不同的认证方式以供选择,单从wrapper函数的实现角度改写如下

def auth(func,db_type):def wrapper(*args, **kwargs):name=input('your name>>>: ').strip()pwd=input('your password>>>: ').strip()if db_type == 'file':print('基于文件的验证')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的验证')elif db_type == 'ldap':print('基于ldap的验证')else:print('不支持该db_type')return wrapper

函数wrapper需要一个driver参数,而函数deco与wrapper的参数都有其特定的功能,不能用来接受其他类别的参数,可以在deco的外部再包一层函数auth,用来专门接受额外的参数,这样便保证了在auth函数内无论多少层都可以引用到

def auth(db_type):def deco(func):def wrapper(*args, **kwargs):name = input('your name>>>: ').strip()pwd = input('your password>>>: ').strip()if db_type == 'file':print('基于文件的验证')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)  # index(1,2)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的验证')elif db_type == 'ldap':print('基于ldap的验证')else:print('不支持该db_type')return wrapperreturn deco

想要保留原函数的文档和函数名属性,需要修正装饰器

def timer(func):def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return reswrapper.__doc__=func.__doc__wrapper.__name__=func.__name__return wrapper

上述方式来实现保留原函数属性过于麻烦,functools模块下提供一个装饰器wraps专门用来

from functools import wrapsdef timer(func):@wraps(func)def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return resreturn wrapper

>带有参数的类装饰器

#参数1 : 给修饰的类添加成员属性和方法
#参数2 : 给类中的run方法变成属性class Kuozhan():ad = "我是属性"def char(self):print("我是方法")def __init__(self,num):self.num = numdef __call__(self,cls):print(cls)if self.num == 1:return self.kuozhan1(cls)elif self.num == 2:return self.kuozhan2(cls)#参数1的情况:添加成员属性和方法def kuozhan1(self,cls):def newfunc():cls.ad = Kuozhan.adcls.money = Kuozhan.moneyreturn cls()return newfunc#参数2的情况:把方法变成属性def kuozhan2(self,cls):def newfunc():if "run" in cls.__dict__:cls.run = cls.run()return cls()return newfunc
#
@Kuozhan(1)
class MyClass():def run():return "运动"
obj = MyClass()
print(obj.ad)
obj.money()#
@Kuozhan(2)
class MyClass():def run():return "运动"
obj = MyClass()
print(obj.run)

>property

可以把方法变成属性 : 可以动态的控制属性的获取,设置,删除相关操作

@property 获取属性

@方法名.setter 设置属性

@方法名.deleter 删除属性

class MyClass():def __init__(self,name):self.name = name@propertydef username(self):return self.name@username.setterdef username(self,val):self.name = valpass@username.delsterdef username(self):def self.namepass
obj = MyClass("小红")
获取指的时候自动触发@property 装饰器下的方法
res = obj.username
print(res)#设置值的时候自动触发@username.setter装饰器下的方法
obj.username = "小白"
print(obj.username)

class Myclass():def __init__(self,name):self.name = name #获取数据def get_username(self):return self.name#设置数据def set_username(self,val):self.name = val#删除数据def del_username(self):del self.name#参数的顺序:获取,设置,删除username = property(get_username, set_username, del_username)obj = MyClass("小白")
#获取值的时候,执行get_username下的相关操作
print(obj.username)
#设置值的时候,执行set_username下的相关操作
print(obj.username)
#删除值的时候,执行del_username下的相关操作
del obj.username
print(obj.username)

二 迭代器

1、什么是迭代器
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复
都是基于上一次的结果而继续的,单纯的重复并不是迭代
2、为何要有迭代器
迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型
有:列表、字符串、元组、字典、集合、打开文件

l=['egon','liu','alex']i=0while i < len(l):print(l[i])i+=1

上述迭代取值的方式只适用于有索引的数据类型:列表、字符串、元组
为了解决基于索引迭代器取值的局限性
python必须提供一种能够不依赖于索引的取值方式,这就是迭代器
3、如何用迭代器

1、可迭代的对象

从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象

2、调用可迭代对象下的__iter__方法会将其转换成迭代器对象

3、可迭代对象与迭代器对象详解
可迭代对象("可以转换成迭代器的对象"):内置有__iter__方法对象
可迭代对象.__iter__(): 得到迭代器对象
迭代器对象:内置有__next__方法并且内置有__iter__方法的对象
迭代器对象.__next__():得到迭代器的下一个值
迭代器对象.__iter__():得到迭代器的本身

4、可迭代对象:字符串、列表、元组、字典、集合、文件对象
迭代器对象:文件对象

5、for循环的工作原理:for循环可以称之为叫迭代器循环,in后可以跟任意可迭代对象

1、d.__iter__()得到一个迭代器对象
2、迭代器对象.__next__()拿到一个返回值,然后将该返回值赋值给k
3、循环往复步骤2,直到抛出StopIteration异常for循环会捕捉异常然后结束循环

6、迭代器优缺点总结
6.1 优点:
I、为序列和非序列类型提供了一种统一的迭代取值方式。
II、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
6.2 缺点:
I、除非取尽,否则无法获取迭代器的长度
II、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

三 生成器

如何得到自定义的迭代器:
在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
会返回一个生成器对象,生成器即自定义的迭代器

def func():print('第一次')yield 1print('第二次')yield 2print('第三次')yield 3print('第四次')触发函数体代码的运行,然后遇到yield停下来,将yield后的值
当做本次调用的结果返回
res1=g.__next__()
print(res1)

dict下如何取值_年薪百万之路--第十七天 装饰器(下)和迭代器相关推荐

  1. session保存密码_年薪百万之路--第六十四天 Cookie操作与session操作

    forms组件源码 切入点:form_obj.is_valid() """ def is_valid(self):"""Returns Tr ...

  2. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    属性取值和赋值过程 一切皆是对象,类型也是对象. 对象包含一个__class__属性指向其所属类型. 对象包含一个__dict__属性指向其所包含的成员(属性和方法). 取值过程(下面是伪代码) 1 ...

  3. create 执行存储过程报错出现符号_年薪百万之路--第四十天 存储引擎

    存储引擎 日常生活中文件格式有很多中,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt,pdf,word,mp4...) 针对不同的数据应该有对应的不同的处理机制来存储 存储引擎就是不同的 ...

  4. jQuery 一次定时器_年薪百万之路--第五十一天 jQuery(上)

    原生js事件绑定 开关灯案例 <div id="d1" class="c1 bg_red bg_green"></div><but ...

  5. python年薪百万_年薪百万之路--第二天:Python入门

    一.编程语言介绍 分类:机器语言(二进制) 执行效率高 计算机易理解 开发效率低 汇编语言 高级语言(编译型,解释型) 编译型----->Gcc编译器-------->机器语言 解释型-- ...

  6. 解决jquery下checked取值问题...

    解决jquery下checked取值问题... 参考文章: (1)解决jquery下checked取值问题... (2)https://www.cnblogs.com/playerlife/archi ...

  7. pandas series取值_【小学生级】pandas入门到精通备查表——AI未来系列3

    在未来面前,每个人都是学生 江海升月明,天涯共此时,关注江时! 引 子 篇为AI未来系列第三篇,中阶部分开始.pandas的数据分析功能比excel强太多,基本上学会pandas,走遍天下都不怕.这是 ...

  8. numpy在折线图上添加取值_见识matplotlib:不常见的一面,折线图

    江湖上所公认的一句话,字不如表,表不如图!人们往往都更喜欢看图说话,那么用python的各位大侠们,大家都在用什么画图呢?各种各样的画图包犹如各式各样的兵器,有的兵器功能单一但是在细分领域超级专业无敌 ...

  9. object取值_如何重写object虚方法

    在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它.前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToStrin ...

最新文章

  1. cmd 修改文件属性
  2. sql嵌套查询返回多个字段_list4 SQL复杂查询
  3. 大学生要学计算机嘛,大学新生有必要买电脑吗,为什么很多人都带电脑去学校了?...
  4. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)
  5. GitHub 标星 14000+,阿里开源的 SEATA 如何应用到极致?
  6. Hadoop HIVE 窗口函数
  7. 春天到了,减肥机器人也到了。
  8. 别人在抢红包,程序员在研究红包算法
  9. Python 通过打码平台实现验证码
  10. excel或wps查找文本字符串子串或拆分字符串公式
  11. java 牙位图插件_牙医的骄傲-智能牙位图中文医疗应用app全球排名No.1
  12. 移除word文档的域代码 remove all field codes of word
  13. 技能get!如何使用PDF查找关键字
  14. python练习题(一):输入某年某月某日,判断这一天是这一年的第几天
  15. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 9月24日
  16. 用计算机做路由器,用笔记本做无线路由(笔记本电脑当无线路由器用怎么设置)...
  17. 将mysql 导出word文档_将数据库的内容生成WORD文档
  18. Why Memory Barriers?中文翻译(上)
  19. CG中DCC什么是?
  20. linux安装maven并配置环境变量

热门文章

  1. 动态修改网页icon图标
  2. html-表单初级验证
  3. java职业发展路线图_软开(Java),该如何规划职业路线?
  4. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作
  5. oracle使用关键字做表字段名_ArcGIS SQL使用
  6. 怎么从gitlab上下载别人的代码
  7. BugkuCTF-Reverse题游戏过关多解法
  8. linux路由信息预览为空,route - 显示并设置Linux中静态路由表
  9. 计算机应用基础(高起专)答案,东北师范大学14秋《计算机应用基础(高起专)》14秋在线作业1答案...
  10. 简述python执行原理_Python程序的执行原理(1)(2)