简单介绍了装饰器的一些基本内容,包含定义、本质、原则、如何实现。

1、装饰器的定义

定义:一种增加函数功能的简单方法,可以快速地给不同的函数或类插入相同的功能。

简单点就是:高阶函数+嵌套函数 -》装饰器

2、装饰器本质

本质:函数 ,为其他函数进行装饰。

举个例子,现在有小狗100只,都有吃喝拉撒的功能,此时我想给其中50只小狗戴上装饰帽的功能,这个装饰帽就是装饰器的功能。但是它并不会改变小狗本身原有的功能。

3、装饰器的原则

原则1:不能修改被装饰的函数的源代码

原则2: 不能修改被装饰的函数的调用方式

4、装饰器的实现

大致了解需要有3个步骤:

4.1 函数即变量

4.2 高阶函数

4.3 嵌套函数

举个例子,装饰器count_time()函数实现对one()函数添加统计函数运行时间的功能

import time
def count_time(func):
def deco():
start = time.time()
func()
end = time.time()
print("the func run time is %s" %(end-start))
return deco
@count_time
//通过语法糖@count_time 直接对one()函数添加统计时间的功能
def one():
time.sleep(0.5)
print('in the one')

详细步骤如下:

4.1函数即变量

举个例子,比如把1赋值给x,内存会为x分配地址,且指向1 ;

此时x赋值给y,y同时也指向1;

同理,定义一个test()函数后,调用这个函数test(),内存会为这个函数分配一个地址,并指向函数体 

4.2 高阶函数

高阶函数一句话理解:函数中的变量包含函数。

A:把一个函数名当做实参传给另外一个函数(在不修改被装饰函数的源代码情况下为其添加功能)

B:返回值中包含函数名(不修改函数的调用方式)

举个例子,高阶函数代码如下:

import time
def count_time(func):
def deco():
start = time.time()
func()
end = time.time()
print("the func run time is %s" %(end-start))//程序运行时间:结束时间减去开始时间
   return deco

4.3 嵌套函数

很简单的一句话:嵌套函数表示的是函数里面有函数。

举个例子,one()函数中嵌套two()函数,嵌套函数代码如下

def one():
print('in the one')
def two():
print('in the two')
two()
#调用函数
one()

5、装饰器高级实现

装饰器涉及到有参数的语法糖、无参数的语法糖,后续有时间可以再次进行详细的了解~

user = 'xxx'
password = '123456'
def A(B):
print("B:",B)
def outer_wrapper(func):
def wrapper(*args, **kwargs):
print("wrapper func args:", *args, **kwargs)
if B == "bb":
user_name = input("Username:")
pass_word = input("Password:")
if user == user_name and password == pass_word:
print("User has passed authentication")
ret = func(*args, **kwargs)
print("---after authenticaion ")
return ret
else:
exit("Invalid username or password")
elif B == "QWW":
print("have question")
return wrapper
return outer_wrapper
def one():
print("in the one") @A(B="bb")
def two():
print("in the two")
return " I'm two" @A(B="QWW")
def three():
print("in the three") one()
print(two())
three()
 

Python 装饰器(装饰器的简单使用)的更多相关文章

  1. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  2. Python中的装饰器的简单介绍02

    这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...

  3. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  4. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  5. python中的装饰器

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

  6. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  7. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  8. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  9. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  10. 理解Python中的装饰器

    文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...

随机推荐

  1. Java—字符流

    一.字符流 字符流概述: 在操作过程中字节流可以操作所有数据,操作的文件中有中文字符,并且需要对 中文字符做出处理 二.字符编码表 文字-->(数字):编码."abc".ge ...

  2. 【Mycat】Mycat核心开发者带你轻松掌握Mycat路由转发!!

    写在前面 熟悉Mycat的小伙伴都知道,Mycat一个很重要的功能就是路由转发,那么,这篇文章就带着大家一起来看看Mycat是如何进行路由转发的,好了,不多说了,我们直接进入主题. 环境准备 软件版本 ...

  3. SpringBoot+MySQL,如何整合并使用MyBatis框架

    概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis 可以使用简单的 ...

  4. MQ-gogogo

    1. RocketMQ https://github.com/alibaba/RocketMQ/wiki/quick-start 2. RabbitMQ https://www.rabbitmq.co ...

  5. 华为+京东数科(原京东金融)面经--Java后台开发

    华为: 1.笔试中遇到的问题,如何解决的?(Scanner 如何结束循环读取数据,笔者在面试中因没有理解到Scanner类的hasNext()与hasNextLine()是阻塞方法,导致没有正确退出循 ...

  6. Netlink 内核实现分析 4

    netlink 库函数: http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals #define NET ...

  7. Mysql_笔记2018.1.29

    1.主要数据库 Oracle MySQL Sqlsever 微软 MongoDB (非关系型数据库) 2.MySql 专业词语 1.数据库:一些关联表的集合 2.数据表:表示数据的矩阵 3.列:同ex ...

  8. Git本地仓库和远程仓库冲突解决

    场景描述: 在本地创建了一个git repo,并且执行了,git init命令,创建了.gitignore文件,或者README.md文件: 在远程创建了一个git repo,创建时也初始化了.git ...

  9. char 和 byte 区别

    byte 是字节数据类型 ,是有符号型的,占1 个字节:大小范围为-128-127 . char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 ):大小范围 是0-65535 :char ...

  10. 想要看懂鸿蒙OS源码?朱老师带你从框架分析开始

    HarmonyOS V2.0是面向轻量级设备的鸿蒙L0/L1级设备端操作系统,于2020.9开源至今已有2个多月,但是很多同学在学习鸿蒙源码时仍然感觉难以下手,找不到突破口. 2020.11.25(本 ...