县城做信息网站招商网站的建设意义
县城做信息网站,招商网站的建设意义,一起做网店网站入驻收费,前端培训班一 有参装饰器带有参数的函数装饰器为被装饰对象添加认证功能的装饰器#xff0c;实现的基本形式如下def deco(func):def wrapper(*args,**kwargs):编写基于文件的认证,认证通过则执行resfunc(*args,**kwargs),并返回resreturn wrapper如果想提供多种不同的认证方式以供选…一 有参装饰器带有参数的函数装饰器为被装饰对象添加认证功能的装饰器实现的基本形式如下def deco(func):def wrapper(*args,**kwargs):编写基于文件的认证,认证通过则执行resfunc(*args,**kwargs),并返回resreturn wrapper如果想提供多种不同的认证方式以供选择单从wrapper函数的实现角度改写如下def auth(func,db_type):def wrapper(*args, **kwargs):nameinput(your name: ).strip()pwdinput(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_timetime.time()resfunc(*args,**kwargs)stop_timetime.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_timetime.time()resfunc(*args,**kwargs)stop_timetime.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 namepropertydef username(self):return self.nameusername.setterdef username(self,val):self.name valpassusername.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]i0while i len(l):print(l[i])i1上述迭代取值的方式只适用于有索引的数据类型列表、字符串、元组 为了解决基于索引迭代器取值的局限性 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后的值
当做本次调用的结果返回
res1g.__next__()
print(res1)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88465.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!