Python 初始—(装饰器)
本质上也是函数的另一种表现形式,为其它函数丰富其功能,装饰其他函数,附加功能
在不改变被装饰的函数的源代码,而且不改变被装饰的函数的调用方式,因此被装饰的函数感知不到装饰器函数的存在
分解装饰器
- 函数即变量
- 高阶函数
- 嵌套函数
函數从上往下依次执行,函数会在内存中创建,当函数未创建,当引用时,在内存中找不到,会出错!!
其中这个函数被引用时,则也是引用这个函数在内存中的空间,于是会出现引用计数
高阶函数
把一个函数当成实参传给另一个函数(在不改变被修饰函数的源代码的情况下为被装饰的函数添加新的功能)
返回值中包含函数名,可以对返回值中的函数的内存地址进行引用进一步对被修饰的函数进行装饰(同时也是不改变被装饰的函数代码的情况下)
嵌套函数
函数即变量,在函数内中定义一个函数,用def去声明一个函数,嵌套函数的作用域只能在函数内,相当于函数内的局部变量
下面实现一个用装饰器模拟的一个网站安全认证的小例如下:
user, passwd = 'jim', '' def auth(auth_type):
def dif_auth(func):
def wrapper(*args, **kwargs):
if auth_type == "local":
user_name = input("请输入用户名").strip()
pwd = input("请输入密码").strip()
if user_name == user and pwd == passwd:
print("\033[32;1m登录成功 \033[0m")
return func(*args, **kwargs) # 返回值
else:
exit("\033[31;1m用户名 or 密码输入有误 \033[0m")
elif auth_type == "internet":
pass return wrapper; return dif_auth @auth(auth_type="local")
def index():
print("这是网站主页") @auth(auth_type="internet")
def detail():
print("网站详情页") index()
detail()
Python 初始—(装饰器)的更多相关文章
- python初始装饰器
python装饰器: 一,函数名的运用. 函数名是一个变量,但他是一个特殊的变量与括号配合可以执⾏行行函数的变量 1.函数名的内存地址 def func(): print("呵呵" ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
随机推荐
- UGUI [TextArea]
- c++ 和 matlab 下的caffe模型输入差异
在向一个caffe模型传递输入数据的时候,要注意以下两点: 1. opencv中Mat数据在内存中的存放方式是按行存储,matlab中图像在内存中的存放方式是按列存储. 2. opencv中Mat数据 ...
- 安装rails遇到的问题
1 要安装js运行环境,例如Nodejs,如果使用nvm记得,安装完执行nvm use '版本号' 2 或者在Gemfile文件中加入: gem 'execjs'gem 'therubyracer'然 ...
- 单元测试-Junit-Mockit-PowerMock
0. Junit5 1. Junit4 //手动命令行测试 java -cp /usr1/junit:/usr1/cdncms/lib/* org.junit.runner.JUnitCore com ...
- Linux安装phpMyAdmin配置管理多个数据库
1.下载 :phpMyAdmin 2.解压安装包: tar -zxvf phpMyAdmin-4.6.5.2-all-languages.tar.gz 3.替换目录 : mv phpMyAdmin-4 ...
- linux程序分析工具介绍(一)—-”/proc”
写在最前面:在开始本文之前,笔者认为先有必要介绍一下linux下的man,如果读者手头用linux系统,直接在终端输入man man便可以看到详细的说明,我在这里简单的总结一下,man命令是用来查看l ...
- sqlserverToXML
--raw模式 以属性的形式展示select * from goods for xml rawselect *from goods for xml raw('goods') --修改节点名称selec ...
- Sharepoint2010新建一个用户的方法
最近在做关于SharePoint的相关开发,在开发中需要用到测试用户进行相关权限的测试,所以就需要创建一个新的用户进行,但是在网上找了很久都没有找到关于创建一个新用户的资料,最后终于在http://w ...
- playbook+roles
playbook setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible ...
- jQuery(四)(DOM一)
jQuery把复杂的代码简单化. 如果我们通过AJAX获取到数据之后然后才能确定结构的话,这种情况就需要动态的处理节点了 一.DOM节点的创建:创建div节点元素的属性和创建div节点元素的样式doc ...