返回顶部
首页 > 资讯 > 后端开发 > Python >初窥Python(五)——python中
  • 781
分享到

初窥Python(五)——python中

初窥Pythonpython 2023-01-31 04:01:53 781人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

1. 介绍decorator是用来在代码运行期间动态增加功能的,本质上是一个返回函数的高阶函数。假设现在有这样一种需求,即在每个函数调用前记录日志,记录被调用的函数名称,可以这样实现:def log(func):     def wrapp



1. 介绍

decorator是用来在代码运行期间动态增加功能的,本质上是一个返回函数的高阶函数。假设现在有这样一种需求,即在每个函数调用前记录日志,记录被调用的函数名称,可以这样实现:

def log(func):
    def wrapper(*args, **kwargs):
        print "CALL %s()" % func.__name__
        return func(*args, **kwargs)
    return wrapper

def sayHi():
    print "Hi, Buddy."

def sayHello():
    print "Hello, Buddy."

# 调用函数,记录日志
log(sayHi)()
# 输出为
# CALL sayHi()
# Hi, Buddy.
log(sayHello)()
# 输出为
# CALL sayHello()
# Hello, Buddy.

这种方法确实实现了记录日志的功能,但每次这么调用未免太过繁琐,decorator因此出现。

2. 使用

其实,之前定义的log函数即为一个decorator,只是使用方式不正确:

@log
def sayHi():
    print "Hi, Buddy."

sayHi()
# 输出为
# CALL sayHi()
# Hi, Buddy.

@log
def sayHello():
    print "Hello, Buddy."

sayHello()
# 输出为
# CALL sayHello()
# Hello, Buddy.

可以看到,使用decorator非常简单方便,def sayHi():前的@log相当于将sayHi作为参数传入log函数中,并将返回值赋给sayHi,即:

sayHi = log(sayHi)

但是细心的读者不难发现,这样一来函数sayHi__name__属性发生变化,由之前的sayHi变为wrapper,使用python内置的functools.wraps方法可以解决这一问题,改造后的decorator如下:

import functools 

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print "CALL %s()" % func.__name__
        return func(*args, **kwargs)
    return wrapper

让我们更进一步,使用三层嵌套的decorator,允许再多传入一次参数:

import functools

def log(text="CALL")
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print "%s %s()" % (text, func.__name__)
            return func(*args, **kwargs)
        return wrapper
    return decorator

这次我们可以选择传入一个表示函数运行状态的字符串,由于多了一层嵌套,使用时也会有些变化:

@log("EXECUTE")
def sayHi():
    print "Hi, Buddy."

sayHi()
# 输出为
# EXECUTE sayHi()
# Hi, Buddy.

修改过后嵌套使用为:

sayHi = log("EXECUTE")(sayHi)

3. 拓展

3.1

修改log函数,使该decorator既可以通过

@log

使用,又可以通过

@log("EXECUTE")

使用:

import functools

def log(text="CALL"):
    if callable(text):
        func = text
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print "CALL %s()" % func.__name__
            return func(*args, **kwargs)
    else:
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                print "%s %s()" % (text, func.__name__)
                return func(*args, **kwargs)
            return wrapper
        return decorator

两种使用方式:

@log
def sayHi():
    print "Hi, Buddy."

sayHi()
# 输出为
# CALL sayHi()
# Hi, Buddy.

@log("EXECUTE")
def sayHello():
    print "Hello, Buddy."

sayHello()
# 输出为
# EXECUTE sayHello()
# Hello, Buddy.
3.2

修改log函数,使该decorator在函数调用前及函数调用后分别输出一条日志:

import functools

def log(func):
    def wrapper(*args, **kwargs):
        print "CALL BEGINNING"
        call = func(*args, **kwargs)
        print "CALL ENDING"
        return call
    return wrapper

使用该decorator

@log
def sayHi():
    print "Hi, Buddy."

sayHi()
# 输出为
# CALL BEGINING
# Hi, Buddy.
# CALL ENDING

参考资料:

廖雪峰的官方网站

--结束END--

本文标题: 初窥Python(五)——python中

本文链接: https://lsjlt.com/news/188047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 初窥Python(五)——python中
    1. 介绍decorator是用来在代码运行期间动态增加功能的,本质上是一个返回函数的高阶函数。假设现在有这样一种需求,即在每个函数调用前记录日志,记录被调用的函数名称,可以这样实现:def log(func):     def wrapp...
    99+
    2023-01-31
    初窥 Python python
  • 初窥Python(一)——使用pymon
    Python 可以使用 pymongo 库方便的操作 MongoDB 。插播一句,MongoDB 不同于关系型结构的三层结构——database--> table --> record,它的层级为 database -->...
    99+
    2023-01-31
    初窥 Python pymon
  • 初窥Python(一)——使用pymongo连接MongoDB
    Python 可以使用 pymongo 库方便的操作 MongoDB 。插播一句,MongoDB 不同于关系型结构的三层结构——database--> table --> record,它的层级...
    99+
    2024-04-02
  • 初窥Python门缝了解入门路径
    目录1 环境配置与基本运算2 调用各种包3 判断、循环4 函数5 数据结构6 字符串7 回到本地8 命令行版2048小游戏此之谓入门,其标准是,在不计效率的情况下,可以使用这门语言实...
    99+
    2024-04-02
  • 6.Python初窥门径(小数据池,集合
    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的值是否相同 is 判断两个内存地址是...
    99+
    2023-01-31
    门径 数据 Python
  • python-初识python
     一.计算机的初步认识     硬件:内存,主板,CPU,硬盘,显卡,显示器等   内存:     优点:存取速度快     缺点:断电后数据会全部丢失   硬盘:     优点:断电后数据也会永久保存     缺点:存取速度远远慢于内...
    99+
    2023-01-31
    python
  • python入门(五)
    *条件语句:    流控制语句-分支结构:    语法:     1.简单条件语句: if 条件:语句     2. if 条件:         语句1;       else:          语句2      3 if   条件: ...
    99+
    2023-01-31
    入门 python
  • Python(五)列表
    数组数组存储的是同一类型的一串信息列表一、列表的定义• 定义一个空列表list = []• 定义一个包含元素的列表,元素可以是任意类型,包括数值类型,列表,元组,字符串等等均可。赋值方式定义:list = ["fentiao", 4, 'g...
    99+
    2023-01-31
    列表 Python
  • Python之路【第五篇】:Python
    一、文件操作 1、介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分。 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的...
    99+
    2023-01-31
    之路 第五篇 Python
  • Python学习笔记五(Python
    Python urllib模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取想要的数据。1.查看urllib模块提供的urlopen函数。help(urllib.urlopen) urlopen(url, data...
    99+
    2023-01-31
    学习笔记 Python
  • 初学Python
    1.了解Python   python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作 为ABC语言的一种继承。最新的TIOB...
    99+
    2023-01-30
    Python
  • Python初识
    1.python介绍 python是一门先编译后解释的语言 动态脚本语言 PyCodeObject和pyc文件 pyCodeObject是python编译器真正的编译成的结果。当python程序运行时,编译的结果是保存在位于内存中的PyCo...
    99+
    2023-01-31
    Python
  • Python 初探
     按照计划,今年要学习一门面向对象的语言,学习的范围锁定几门,PHP/PERL/PYTHON/RUBY,由于上半年学了bash,感觉python比较适合自己。从今天开始不定期的出一些笔记出来 #! /usr/bin/python   ID...
    99+
    2023-01-31
    Python
  • 初识Python
      Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。  Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU Gene...
    99+
    2023-01-31
    Python
  • 初识 Python
    1.源码安装 ipython 1.2.1[root@Client-1]# tar -xf ipython 1.2.1.tar.gz[root@Client-1]cd ipython 1.2.1[root@Client-1 ipython-1...
    99+
    2023-01-31
    Python
  • 初学者快看,Python下划线的五个作用介绍
    目录前言1、用在 Python 解释器,表示上一次的执行结果2、代码中一个独立的下划线,表示这个变量不重要3、双下划线开头和结尾的方法,是魔术方法4、作为变量名中间的一部分5、作为数...
    99+
    2024-04-02
  • 初入Python —— Python下载
    Python是一个较为高级的编程语言。那要怎么使用它呢? 所以,我们要知道如何下载Python。 目录 前言 一、Python下载 1.下载方法(一) 2.下载方法(2)  3.下载方法(3)——Windows版本 二、Python...
    99+
    2023-09-04
    python
  • Python之路--Python初识
    python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。   编程语言主要分...
    99+
    2023-01-30
    之路 Python
  • Python基础-初识Python
    本文防盗链:http://python789.blog.51cto.comPython基础-初识Python    作者是一名运维工程师,以下为作者学习Python的笔记,希望能给大家带来一些帮助,写的有不对的地方,还望大家指出来,或者加入...
    99+
    2023-01-31
    基础 Python
  • Python五彩气球
    系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want...
    99+
    2023-09-04
    python 开发语言 pycharm
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作