python函数装饰器构造和参数传递

目录
  • 一.闭包函数
  • 二.python装饰器构造
  • 三.python装饰器叠加
  • 四.python装饰器传参
    • 1.装饰器单个参数传递
    • 2.装饰器多个参数传递
    • 3.装饰器的不定长参数
  • 五、带返回值的装饰器

前言:

通过@语句调用一个函数去给另一个函数增加或修改一些功能的语法规则称之为Python装饰器。下面通过一个小案例来简单的理解什么是装饰器。

def dog():
    print('摇尾巴')
    def cat():
        print('喵喵喵')
        
call = '狗'if call == '狗':
    dog()else:
    cat()

这时候有一个需求,必须是猫和狗的主人呼喊它们才会做出以上动作,就需要对指令发出者进行身份验证。如果直接在判断上采用身份验证,这样代码重用度会很低,如果在上面两个函数中写,如果验证代码过多,可能需要写好几遍。这时候我们可以再创建一个函数,在调用dogcat函数的时候先调用身份验证函数,但是这样,我们的dog函数用在其他地方时如果不需要验证就会有冗余代码。上面几种方案都有自己的缺点,我们可以试试前面学习的闭包函数来实现这个功能。

一.闭包函数

def func(f):
    def test():
        print('主人身份验证')
        f()
    return test
    
def dog():
    print('摇尾巴')
dog = func(dog) # 这里的dog其实是test函数
 
def cat():
    print('喵喵喵')
cat = func(cat)
call = '狗'
if call == '狗':
    dog() # ★★★这里的dog函数其实是test函数,所以先执行身份验证,然后又调用f()函数,也就是原来的dog()函数,也可以给这行的dog函数换个名字,好理解★★★
else:
    cat()

二.python装饰器构造

python提供一种简单的装饰器写法,叫做语法糖,

如下:

def func(f):
    def test():
        print('主人身份验证')
        f()
    return test
    
@func
def dog():
    print('摇尾巴')
# dog = func(dog)
 
@func
def cat():
    print('喵喵喵')# cat = func(cat)
call = '狗'
if call == '狗':
    dog()
else:
    cat()

函数体不发生改变,增加了额外的功能,重用性高。 装饰器内部必须使用闭包函数,否则当使用@时,装饰器就会被直接执行,注意执行顺序。

三. python装饰器叠加

# 装饰器可以被叠加使用
def func(f):
    def test():
        print('主人身份验证')
        f()
    return test
    
def func2(f):
    def test2():
        print('=======')
        f()
 return test2
 
@func2
@func  # 可以叠加使用装饰器,先执行上面的装饰器
def dog():
    print('摇尾巴')
dog() # 这里的dog函数其实是test和test2两个函数,而test和test2又返回来调用上面的dog()原始函数

四.python装饰器传参

1.装饰器单个参数传递

def test(f):
    def test1(x):
        print('==========')
        f(x)
    return test1
    
@test
def func1(m):
    print(m)
    
func1(10)

2.装饰器多个参数传递

def test(f):
    def test1(x, y):
        print('==========')
        f(x, y)
    return test1
    
@test
def func2(m, n):
    print(m, n)
    
func2(10, 5)

3.装饰器的不定长参数

def test(f):
    def test1(*args, **kwargs):
        print('==========')
        f(*args, **kwargs)
    return test1
 
@test
def func2(a, b, c):
    # print(args, kwargs)
    print('*********')
func2(10, 5, c=6) # 这里的c和上面func2的第三个形参名要一致

五、带返回值的装饰器

def test(f):
    def test1(*args, **kwargs): # 这里的test1函数要和被装饰函数func2的结构保持一致
        print('==========')
        res = f(*args, **kwargs) # 这里相当于把被装饰函数的结果拿过来赋值,f(*args, **kwargs)的执行结果就是func2的返回值
        return res  # 没有返回值也可以这样写,返回结果就是None
    return test1
    
@test
def func2(a, b, c):
    # print(args, kwargs)
    print('*********')
    return a + b + c
print(func2(10, 5, c=88))

到此这篇关于python函数装饰器构造和参数传递的文章就介绍到这了,更多相关python函数装饰器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python参数传递机制传值和传引用原理详解

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

  • 巧用Python装饰器 免去调用父类构造函数的麻烦

    先看一段代码: 复制代码 代码如下: class T1(threading.Thread): def __init__(self, a, b, c): super(T1, self).__init__() self.a = a self.b = b self.c = c def run(self): print self.a, self.b, self.c 代码定义了一个继承自threading.Thread的class,看这句 super(T1, self).__init__() 也有些人喜欢

  • 详解Python函数式编程之装饰器

    目录 一.装饰器的本质: 函数闭包(functionclosure): 二.装饰器使用方法: 保留函数参数和返回值的函数闭包: 三.多个装饰器的执行顺序: 四.创建带参数的装饰器: 总结 一.装饰器的本质: 装饰器(decorator)本质是函数闭包(function closure)的语法糖(Syntactic sugar) 函数闭包(function closure): 函数闭包是函数式语言(函数是一等公民,可作为变量使用)中的术语.函数闭包:一个函数,其参数和返回值都是函数,用于增强函数功

  • 深入了解python装饰器

    目录 一.装饰器 1.相关知识点 2.语法糖 3.装饰器模板 4.有参装饰器 一.装饰器 1.相关知识点 *args:负责将多余的位置实参汇总,赋值给args **kwargs:负责将多余的关键字实参汇总,赋值给kwargs 命名空间与作用域 函数对象: 可以把函数当成参数传入 可以把函数当做返回值返回 函数的嵌套定义:在函数内定义函数 闭包函数:父函数的返回值为一个函数,被返回的函数调用了父函数的局部变量,且该函数可以在父函数外部执行 装饰器: 装饰器:定义一个为其他函数添加功能的函数 为什么

  • Python的装饰器详情介绍

    目录 1.定义及使用 2.@classmethod 1.定义及使用 例1:装饰器定义: def 装饰器函数(外部函数):            def 内联函数(*args,**kwargs):                ...前置装饰...                外部函数(*args,**kwargs)                ...后置装饰...            return 内联函数  例2:装饰器两种调用方式 第一种:装饰器函数(外部函数)(参数1,参数2....

  • python关键字传递参数实例分析

    1.说明 关键词传递以"形参变量名=实参"的形式参与实参关联,根据形参的名称进行参数传递,使实参和形参的顺序不一致.不用担心定义函数时参数的顺序,直接在传参时指定相应的名称即可. 2.两种形式 makeup_url(protocal='http', address='www.baidu.com') makeup_url(address='www.baidu.com',protocal='http') 3.实例 def makeup_url(protocal, address): pri

  • Python参数传递及收集机制原理解析

    python参数传递时,主要有位置参数和关键字参数. 1. 位置参数:顾名思义,参数的位置顺序很重要,因为是直接根据位置赋值的. def func1(a, b): print(a,b) # 位置参数,位置顺序很重要 func1(1,2) 2. 关键字参数:首先使得位置不那么重要了,毕竟参数一多,有些人记不住位置也很正常:其次更重要的是可以提供初始值. def func2(c=1, d=2): print(c,d) # 关键字参数,1. 使得位置不那么重要:2. 可提供初始值 func2() #使

  • python函数装饰器构造和参数传递

    目录 一.闭包函数 二.python装饰器构造 三.python装饰器叠加 四.python装饰器传参 1.装饰器单个参数传递 2.装饰器多个参数传递 3.装饰器的不定长参数 五.带返回值的装饰器 前言: 通过@语句调用一个函数去给另一个函数增加或修改一些功能的语法规则称之为Python装饰器.下面通过一个小案例来简单的理解什么是装饰器. def dog():     print('摇尾巴')     def cat():         print('喵喵喵')          call =

  • Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等应用场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 严格来说,装饰器只是语法糖,

  • Python 函数装饰器应用教程

    目录 一.什么是函数装饰器 二.函数装饰器的执行时机 三.变量作用域 四.闭包 五.保留函数的元数据 七.使用lru_cache缓存函数执行结果 八.使用singledispatch实现泛型函数 九.通过参数控制函数装饰器的行为 一.什么是函数装饰器 1.函数装饰器是Python提供的一种增强函数功能的标记函数: 2.装饰器是可调用的函数对象,其参数是另一个函数(被装饰的函数): 我们可以使用修饰器来封装某个函数,从而让程序在执行这个函数之前与执行完这个函数之后,分别运行某些代码.这意味着,调用

  • python函数装饰器用法实例详解

    本文实例讲述了python函数装饰器用法.分享给大家供大家参考.具体如下: 装饰器经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计, 有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. #! coding=utf-8 import time def timeit(func): def wrapper(a): start = time.clock() func

  • Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们应该遵循开放封闭的原则. 也就是说:我们必须找到一种解决方案,能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能. 总结:原则如下: 1.不修改源代码 2.不修改调用方式 目的:在遵循1和2原则的基础上扩展新功能. 二.什么是装饰器? 器:指的是工具, 装饰:指的是为被装饰对象添加

  • Python函数装饰器实现方法详解

    本文实例讲述了Python函数装饰器实现方法.分享给大家供大家参考,具体如下: 编写函数装饰器 这里主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s

  • 如何实现一个python函数装饰器(Decorator)

    装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象.它经常用于为已有函数/类添加记录日志.计时统计.性能测试等. 首先定义一个倒计时函数,这个函数的功能非常简单,就是把n从当前值减少到0. def countdown(n): while n > 0: print('time' + str(n)) n -= 1 print(countdown.__name__) 程序输出: countdown 1.为函数增

  • Python函数装饰器的使用教程

    典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过自由变量绑定后,调用函数并返回结果. 使用clock装饰器: import time from clockdeco import clock @clock def snooze(seconds): time.sleep(seconds) @clock def factorial(n): return 1 if n < 2 else n*factorial(n-1) if _

  • Python函数装饰器的使用详解

    目录 装饰器 装饰器的定义 装饰器的意义 装饰器的使用 无参装饰器 有参装饰器 实例练习 总结 装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function decorators are simply wrappers to existing functions.In the context of design patterns,decorators dynamically alter the functionality of a function, met

  • Python 函数装饰器详解

    目录 使用场景 授权(Authorization) 日志(Logging) 带参数的装饰器 在函数中嵌入装饰器 装饰器类 总结 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁.首先,让我们讨论下如何写你自己的装饰器. 这可能是最难掌握的概念之一.我们会每次只讨论一个步骤,这样你能

随机推荐