我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 语法之装饰器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 语法之装饰器

  装饰器的概念

  装饰器是 Python 的一个重要部分。简单地说:就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。

  这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌 “原” 函数的函数。

  将函数作为参数传给另一个函数

  def yanzheng():

  return "--- 正在验证 ---"

  def login(func):

  print(func())

  print("--- 正在登陆 ---")

  login(yanzheng)

  运行结果:

  --- 正在验证 ---

  --- 正在登陆 ---

  写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

  封闭:已实现的功能代码块

  开放:对扩展开发

  现在你已经具备所有必需知识,接下来进一步学习什么是真正的装饰器。

  你的第一个装饰器

  def func_out(func):

  def func_in():

  print("--- 正在验证 ---")

  func()

  return func_in

  @func_out

  def login():

  print("--- 正在登陆 ---")

  login()

  运行结果:

  --- 正在验证 ---

  --- 正在登陆 ---

  @函数名称 是 Python 的一种语法糖。简而言之,语法糖就是程序语言中提供[奇技淫巧]的一种手段和方式而已。 通过这类方式编写出来的代码,即好看又好用,好似糖一般的语法。固美其名曰:语法糖

  装饰器下面正好是个函数,则默认执行:login = func_out(login)

  装饰器的流程图

  

  装饰有返回值的函数

  上面的案例,被装饰的 login() 函数并没有返回值,那么接下来咱们看看有返回值的函数如何装饰。

  首先,先看第一个案例:

  def func_out(func):

  def func_in():

  print("--- 正在验证 ---")

  func()

  return func_in

  @func_out

  def login():

  return "--- 正在登陆 ---"

  result = login()

  print(result)

  运行结果:

  --- 正在验证 ---

  None

  思考一下,为什么我调用 login() 函数,并且使用 result 变量来接收返回值,为什么结果是 None 呢?

  如果想不明白,就看看第二个案例:

  def func_out(func):

  def func_in():

  print("--- 正在验证 ---")

  data = func()

  return data

  return func_in

  @func_out

  def login():

  return "--- 正在登陆 ---"

  result = login()

  print(result)

  运行结果:

  --- 正在验证 ---

  --- 正在登陆 ---

  大家仔细观察代码,这两个案例有哪些不同?

  发现了吗?我在 func_in() 函数的里面多写了两句代码:

  1、当我们调用被装饰的 login() 函数时,实际执行的是 func_in() 函数的代码,此时会调用 print() 函数打印 "--- 正在验证 ---"。郑州人流医院 http://rl.zyfuke.com/

  2、代码执行到 data = func() 时,会先执行右侧的 func() 函数,而这个函数是原始的 login() 函数,所以会 return 返回一个值,此时这个值被等号左侧的 data 变量接收。

  3、代码执行到 return data,此时会将 data 值返回更上一层,而这个值被 result 变量接收。

  4、最终打印 result 变量就输出了原始 login() 函数的值。

  在这里最需要注意的就是 return 返回数据,只能返回一层函数,多层时,就需要在上层同时使用 return。

  装饰有参数的函数

  demo1:

  def func_out(func):

  def func_in():

  func()

  return func_in

  def login(a):

  prin

  print(a)

  login(10)

  运行结果:

  10

  demo2:

  def func_out(func):

  def func_in():

  func()

  return func_in

  @func_out

  def login(a):

  print(a)

  login(10)

  运行结果:

  TypeError: func_in() takes 0 positional arguments but 1 was given

  类型错误:func_in()接受0个位置参数,但给出了1个

  demo3:

  def func_out(func):

  def func_in(data):

  func(data)

  return func_in

  @func_out

  def login(a):

  print(a)

  login(10)

  运行结果:

  10

  demo4:

  def func_out(func):

  def func_in(*args,**kwargs):

  func(*args,**kwargs)

  return func_in

  @func_out

  def login(*args,**kwargs):

  print(args)

  print(kwargs)

  login(10,20,c=1,b=2)

  运行结果:

  (10, 20)

  {'c': 1, 'b': 2}

  总结

  装饰器函数只有一个参数就是被装饰的函数的引用

  装饰器能够将一个函数的功能在不修改代码的情况下进行扩展

  在函数定义的上方@装饰器函数名 即可直接使用装饰器对下面的函数进行装饰

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 语法之装饰器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python 语法之装饰器

  装饰器的概念  装饰器是 Python 的一个重要部分。简单地说:就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。  这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌 “原”
2023-06-02

Python之装饰器

在Python中一切皆对象,函数是一等对象。这意味着可以通过名字引用函数。>>> a=123>>> a123>>> name='zeng'>>> name'zeng'>>> def func():...     print "hello!"
2023-01-31

python魔术方法之装饰器

三个魔术方法:__get__()__set__()__delete__()object.__get__(self,实例名,owner)    #owner = 属主 ,instance = 属主类owner的实例object.__set__
2023-01-31

day20-python之装饰器

1.装饰器 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import time 4 def cal(l): 5 start_time=time.time() 6 re
2023-01-31

python之yield与装饰器

防伪码:忘情公子著python中的yield:  在之前发布的《python之列表解析与生成器》中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析的操作。  因为生成器本身就不是一个列表,它只是模拟
2023-01-31

python进阶之装饰器

一.无参装饰器问题:如何计算一段程序的运行时间?先看一段简单代码:1 import time2 def func():3 start = time.time() # 记录程序开始时间4 time.sleep(5)5
2023-01-30

python之装饰器(函数)

1. 装饰器   遵循的原则:     开闭原则:   对功能的扩展开放  对代码的修改是封闭# 通用装饰器写法# 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能.def wrapper(fn): #
2023-01-30

详解Python装饰器之@property

一、property() 函数讲解 了解 @property 装饰器之前,我们首先要了解内置函数的 property()。class property(fget=None, fset=None, fdel=None, doc=None)描述
2022-06-02

Python 3 之 装饰器详解

------------ 装饰器 -----------------------------------------------------什么是装饰器装饰器是为函数和类指定管理代码的一种方式。装饰器本身的形式是处理其他的可调用对象的可调用
2023-01-31

python学习系列之python装饰器

一、常规的装饰器,比如 @auth,执行2步操作:1、执行auth函数,并传参func进来2、获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值)二、而带参数的装饰器,比如 @auth(before
2023-01-31

python装饰器2:类装饰器

装饰器1:函数装饰器装饰器2:类装饰器装饰器3:进阶本文是装饰器相关内容的第二篇,关于类装饰器。"类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。你如何认为取决于你,两种说法都有出现在其它的文章中。我的文章中是将"类
2023-01-30

Python全栈开发之---装饰器

1、装饰器的形成过程 1 import time 2 3 def func1(): 4 print('in func1') 5 6 def timer(func): 7 def inner(): 8 st
2023-01-30

python-装饰器

装饰器简介:给被装饰的函数在不更改代码的基础上增加新的功能;多个装饰器的执行顺序:从最靠近原始函数的装饰器开始执行,最后执行原始函数; 直接上个简单的例子就懂了: 一 最简单的装饰器:#!/usr/bin/python def deco(f
2023-01-31

python 装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不雲要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面雲求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳
2023-01-30

python之我对装饰器的理解

从一开始学习python的时候,就一直不是很理解装饰器是个什么东东,再看了很多篇博文和自己动手敲了好多代码后,算是略有了解。  我理解的装饰器是: 在不改变原有函数调用的情况下,对其进行包装,使其变成另外一种函数来使用,一般的用途是 插入日
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录