python:带参数的装饰器,函数的有用信息
一、带参数的装饰器,函数的有用信息
def func1():
'''此函数的功能是完成的登陆的功能
return: 返回值是登陆成功与否(true,false)
''' print(333) func1()
print(func1.__name__)#func1
print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否
打印函数名
from functools import wraps
def wrapper(f):
@wraps(f)
def inner(*args,**kwargs):
#函数运行之前的操作
ret = f(*args,**kwargs)
#执行函数之后的操作
name = f.__name__
print(name)
return ret
return inner @wrapper
def func1():
print(666)
func1()
二、带参数的装饰器
给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
import time
def wrapper(func):
def inner(*args,**kwargs):
struct_time = time.localtime()
time_now = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
with open('log',encoding = 'utf-8',mode = 'a')as f:
f.write('在%s时间,执行了%s函数\n'%(time_now,func.__name__))
ret = func(*args,**kwargs)
'''函数操作之后'''
return ret return inner
@wrapper
def func1():
print(6660)
func1()
在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:
设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。
设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。
供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。
dic = {
'username':None,
'status':False,
}
def login(flag):
def wrapper(func):
def inner(*args,**kwargs):
if dic['status']:
ret = func(*args,**kwargs)
return ret
else:
count = 0
while count<3:
username = input('请输入你的用户名:').strip()
password = input('请输入你的密码').strip()
with open('msg2',encoding = 'utf-8')as f:
msg_dic= eval(f.readline())
if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']:
dic['username'] = username
dic['status'] = True
ret = func(*args,**kwargs)
return ret
else:
print('您输入的用户名或者密码错误,请从新输入,还有%s次机会' %(2-count))
count+= 1
return inner
return wrapper
@login('微信')
def taobao_home():
print('淘宝首页')
@login('qq')
def JD_home():
print('京东首页')
choice_dict={
1:taobao_home,
2:JD_home,
}
while True:
print('1 淘宝首页\n2 京东首页')
choice_num = input('请选择输入的序号:').strip()
if choice_num.isdigit():
choice_num = int(choice_num)
if 0 < choice_num <= len(choice_dict):
choice_dict[choice_num]()
else:
print('请输入范围内的序号')
else:
print('您输入的有非法字符,请从新输入')
python:带参数的装饰器,函数的有用信息的更多相关文章
- Python 带参数的装饰器 [2] 函数参数类型检查
在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...
- Python带参数的装饰器
在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...
- python3带参数的装饰器 函数参数类型检查
from inspect import signature#python3才有的模块 def typeassert(*args,**kwargs): def decorator(fun): sig=s ...
- Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...
- Python之函数的进阶(带参数的装饰器)
函数篇--装饰器二 带参数的装饰器 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函 ...
- python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)
函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...
- python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结
1.上周回顾 1).函数名的应用 直接打印函数名,是函数的地址 变量 函数的参数 函数的返回值 可以当容器类数据类型的元素 2).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...
- python 装饰器 (多个参数的函数,带参数的装饰器)
最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...
- Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数
函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...
随机推荐
- zend cache使用
require_once 'Zend/Cache.php';//引用文件$frontendOptions = array( 'lifeTime' => 60, // cache lifetime ...
- js各种特效轮播图,选项卡,放大镜,窗口拖拽,楼层跳转
// 透明度轮播图 // img:轮播图片 // dot:轮播点 // lbtn:左箭头 // rbtn:右箭头 // banner:轮播盒子 // active:轮播点选中效果类名 // time: ...
- zzw原_环境变量导致date命令显示处理一例
1.显示时间看不懂 [root@localhost ~]# date201790:02:06 CST 2.注释掉环境变量bash_profile的两行配置 [root@localhost ~]# vi ...
- python----集合用法总结
集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据集合的作用:1.它可以把一个列表中重复的数据去掉,而不需要你再写判断2.可以做关系测试,比如说有两个班 ...
- C#中用NPOI的excel导出
//机构表导出 private static List<User2> amininf = new BLL.Bll().GetUser2s(); //定义数据源导出对象 #region 导出 ...
- JavaScript之作用域
1. 作用域 变量能够起作用的范围,作用域分为全局作用域和局部作用域 全局作用域: 1. 最外层函数或者在最外层函数外通过var定义的变量: 2. window对象的属性和方法具有全局作用域: 3. ...
- SamplesHashtable
using System; using System.Collections; public class SamplesHashtable { public static void Main() { ...
- Ubuntu Server 16.04设置WiFi
wifi :http://www.cnblogs.com/joeyupdo/p/3350463.html http://blog.csdn.net/meic51/article/details/173 ...
- 百度前端代码规范:CSS
1.代码风格 1.1 文件 [建议] CSS 文件使用无 BOM 的 UTF-8 编码. 1.2 缩进 [强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符. 1.3 ...
- Flex布局-容器的属性
本文部分内容参考阮一峰大神博客,原文地址:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex布局即弹性布局,使用起来十分方便灵活 ...