定义:
  
本质是函数,功能是“装饰”其它函数,即为其他函数添加附加功能
原则:
1、不能修改被装饰函数的源代码;
2、不能修改被装饰函数的调用方式
实现装饰器知识储备:
1、函数即“变量”;
2、高阶函数;
3、嵌套函数。

实例1:初始版
# 定义装饰器函数
import time
def qt_fun(func):
def gj_func(*args,**kwargs): #关键点,定义不定实参传入值个数*args,形参个数**kwargs
start_time=time.time()
func(*args,**kwargs) #关键点,传入参数
stop_time=time.time()
print('运行时间:',stop_time-start_time)
return gj_func #关键点,返回值。 @qt_fun #关键点,引用装饰器,相当于:test1 = qt_fun(test1)
def test1(name):
time.sleep(1)
print('姓名:',name) @qt_fun #关键点,引用装饰器,test2 = qt_fun(test2) test2()
def test2(name,age,addrs):
time.sleep(2)
print('姓名:%s 年龄:%s 地址:%s'%(name,age,addrs)) #test1 = qt_fun(test1)
#test1() #可替换成 @qt_fun @装饰器名 #调用函数
test1('simple')
test2('simple',26,'四川')


实例2:终极版

user_name = 'simple'
password = '123'
def choose_type(c_type):
def login_f(func):
def in_fun(*args,**kwargs):
if c_type == 'A':
print('当前选择的验证方式为:', c_type)
name=input('用户名:').strip()
passwd=input('密码:').strip()
if name==user_name and passwd==password:
print('登录成功!')
func(*args,**kwargs)
else:
exit('用户名或密码不正确,登录失败!')
elif c_type == 'B':
print('当前选择的验证方式为:', c_type)
print('此验证方式,开发中....')
else:
print('输入的验证方式不正确!')
return in_fun
return login_f @choose_type(c_type=input('请选择home的验证方式(A/B):').strip())
def home():
print('欢迎进入主页!') @choose_type(c_type=input('请选择bbs的验证方式(A/B):').strip())
def bbs():
print('欢迎进入bbs界面!') def index():
print('欢迎光临index界面!此界面无需验证!') home()
bbs()
index()

输出结果:

初识python: 装饰器的更多相关文章

  1. 初识Python装饰器

    python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...

  2. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  3. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  4. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  7. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  8. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  9. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  10. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

随机推荐

  1. lucene的索引查询

    package com.hope.lucene;import org.apache.lucene.document.Document;import org.apache.lucene.document ...

  2. Spring Batch Event Listeners

    Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...

  3. 我的第一篇博客blog,笑哭

    我的第一篇博客blog Markdown学习 一级标题:#加一个空格 加 文字, 二级标题:加2个##以此类推 字体 粗体:hello world!字体前有二个星号,字体后有二个星号 斜体:hello ...

  4. Linux的命令行基础

    1.对于全局配置文件和用户配置文件的认识 全局配置都存储在etc目录下,如/etc/profile文件,/etc/bashrc文件以及/etc/profile.d/目录下的.sh文件 用户配置都存储在 ...

  5. centos部署代码仓库gitlab

    目录 一.简介 二.程序部署 部署gitlab 汉化gitlab 三.设置管理员密码 网页方式 指令方式 一.简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托 ...

  6. 【dva】model中effects函数的解析

    结构 effects: { *pageQuery({ payload = {} }, { select, call, put }) { const res = yield call(pageQuery ...

  7. 铁人三项(第五赛区)_2018_rop

    拿到程序依旧老样子checksec和file一下 可以看到是32位的程序开启了nx保护,将程序放入ida进行查看 shift+f12 看到没有system和binsh等字样,考虑用泄露libc来做这道 ...

  8. [BUUCTF]PWN——bbys_tu_2016

    bbys_tu_2016 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况,测试时候发现输入长度过长程序会崩溃,猜测输入点存在问题 32位ida载入,检索程序里的 ...

  9. js--对象内部属性与 Object.defineProperty()

    前言 JavaScript 中允许使用一些内部特性来描述属性的特征,本文来总结一下对象内部属性与 Object.defineProperty() 的相关知识. 正文 1.属性类型 js中使用某些内部属 ...

  10. uni-app + Cloudbase——uni-app 项目中如何使用腾讯云开发后端服务

    1 基本介绍 uni-app 是一个基于 Vue.js 的跨端开发框架,一套代码可以发布到 App.小程序.Web 等不同平台 腾讯云开发平台 Cloudbase 提供的 @cloudbase/js- ...