例如@classmethod,@staticmethod的本质就是函数装饰器,其中,classmethod和staticmethod都是python的内置函数

  使用@引用已有的函数后,可用于修饰其他函数,装饰被修饰的函数。我们可以开发自定义的函数装饰器

  装饰的过程可以分为

  1. 将被修饰的函数作为参数传递给@符号引用的函数
  2. 将被修饰的函数换成装饰函数的返回值

代码实例

 1 def funA(fu):
2 print("a")
3 fu()#执行被传入的参数
4 return "b"
5 @funA
6 def funb():
7 print("c")
8 print(funb)
9 """
10 程序的运行过程:
11 1.将funb作为参数传递给装饰函数funA,也就是@funA相当于执行的funA(fu nb)
12 2.将funb替换成装饰函数的返回值
13 """

运行结果

a
c

b

  通过这个例子,我们已经对装饰器的执行关系有了一定的了解和认识。可能有人认为,被修饰的函数已经变成了字符串。

注意:

  被修饰的函数总是被替换成函数装饰器的返回值,因此被修饰的函数会变成怎么样完全由函数修饰器的返回值来决定的

代码示例:

14 def jiugongge(fu):
15 def do():
16 num = int(input())
17 a = [[0 for i in range(num)]for i in range(num)]
18 #将第一行中间那列的值定为1
19 a[0][num//2] = 1
20 x = 0
21 y = num//2
22 #将2以后的值依次填入列表中
23 for i in range(1,num*num):
24 j = i + 1
25 x = x - 1
26 y = y + 1
27 if x < 0 and y <= num - 1:
28 x = x + 3
29 a[x][y] = j
30 elif x < 0 and y > num - 1:
31 x = x + 2
32 y = y - 1
33 a[x][y] = j
34 elif y > num - 1:
35 y = 0
36 a[x][y] = j
37 else:
38 if a[x][y] == 0:
38 if a[x][y] == 0:
39 a[x][y] = j
40 else:
41 x = x + 2
42 y = y - 1
43 a[x][y] = j
44
45 for n in range(num):
46 for m in range(num):
47 print(str(a[m][n]).rjust(2,"0"),end = "\t")
48 print()
49 return do
50 @jiugongge
51 def funcation():
52 print("funcation")
53 funcation()

运行结果:

3
08      03      04

01      05      09

06      07      02

此时的funcation函数已经被替换成了do函数,应为修饰器函数的返回值是do函数
调用funcation其实就是在调用do函数

python-@函数装饰器的更多相关文章

  1. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  2. python函数-装饰器

    python函数-装饰器 1.装饰器的原则--开放封闭原则 开放:对于添加新功能是开放的 封闭:对于修改原功能是封闭的 2.装饰器的作用 在不更改原函数调用方式的前提下对原函数添加新功能 3.装饰器的 ...

  3. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  4. Python 函数装饰器

    首次接触到装饰器的概念,太菜啦! Python 装饰器可以大大节省代码的编写量,提升代码的重复使用率.函数装饰器其本质也是一个函数,我们可以把它理解为函数中定义了一个子函数. 例如我们有这么一个需求, ...

  5. Python @函数装饰器及用法

    1.函数装饰器的工作原理 函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn ...

  6. Python @函数装饰器及用法(超级详细)

    函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn() # 执行传入的fn参 ...

  7. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  8. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  9. Python 函数装饰器简明教程

    定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...

  10. Python高手之路【四】python函数装饰器,迭代器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. cheerio & jQuery for server

    cheerio & jQuery for server Fast, flexible & lean implementation of core jQuery designed spe ...

  2. how to design a search component in react

    how to design a search component in react react 如何使用 React 设计并实现一个搜索组件 实时刷新 节流防抖 扩展性,封装,高内聚,低耦合 响应式 ...

  3. 如何用 js 实现一个 sleep 函数

    如何用 js 实现一个 sleep 函数 原理 实现方式 总结 refs js sleep xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. TypeScript & as & Type Assertion

    TypeScript & as & Type Assertion Type Assertion (as) That is not vanilla JavaScript, it is T ...

  5. Python module all in one

    Python module all in one Python Modules https://docs.python.org/3/tutorial/modules.html Fibonacc # F ...

  6. JavaScript & Automatic Semicolon Insertion

    JavaScript & Automatic Semicolon Insertion ECMA 262 真香警告️ https://www.ecma-international.org/ecm ...

  7. Vue 3.x Composition API

    Vue 3.x Composition API setup 调用时机 创建组件实例,然后初始化 props ,紧接着就调用setup 函数; 从生命周期钩子的视角来看,它会在 beforeCreate ...

  8. CSS3 & gradient & color & background

    CSS3 & gradient & color & background css background https://developer.mozilla.org/en-US/ ...

  9. windows driver 简单的驱动和通信

    sysmain.c #pragma once #pragma warning(disable: 4100) #include <ntifs.h> #include <ntddk.h& ...

  10. 大数据开发-linux下常见问题详解

    1.user ss is currently user by process 3234 问题原因:root --> ss --> root 栈递归一样 解决方式:exit 退出当前到ss再 ...