装饰器

什么是装饰器?

​ 装饰器是一个函数,主要作用是用来给包装另一个函数或者类

包装的目的是不改变原函数名(或类名)的情况下改变或添加被包装对象的功能

函数装饰器

是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数

语法:

  1. def 装饰器函数名(参数):
  2. 语句块
  3. return 函数对象
  4. @张诗琪函数名
  5. def 函数名(形参列表):
  6. 语句块

示例:

  1. # 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
  2. # 的语法
  3. def mydeco(fn):
  4. def fx():
  5. print("++++++++++++++++")
  6. print('----------------')
  7. return fx
  8. def myfunc():
  9. '''此函数将作为被装饰函数'''
  10. print("myfunc被调用")
  11. # 原理是让myfunc重新绑定mydeco返回回来的函数
  12. myfunc = mydeco(myfunc)
  13. myfunc()
  14. myfunc()
  15. myfunc()
  1. # 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
  2. # 的语法
  3. def mydeco(fn):
  4. def fx():
  5. print("++++++++++++++++")
  6. print('----------------')
  7. return fx
  8. @mydeco
  9. def myfunc():
  10. '''此函数将作为被装饰函数'''
  11. print("myfunc被调用")
  12. # myfunc上的@mydeco 等同于在
  13. # 此处加上 myfunc=mydeco(myfunc)
  14. myfunc()
  15. myfunc()
  16. myfunc()
  1. # 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
  2. # 的语法
  3. def mydeco(fn):
  4. def fx():
  5. print("++++++++++++++++")
  6. fn() # 调用以前的被装饰函数
  7. print('----------------')
  8. return fx
  9. @mydeco
  10. def myfunc():
  11. '''此函数将作为被装饰函数'''
  12. print("myfunc被调用")
  13. myfunc()
  14. myfunc()
  15. myfunc()
  1. # 此示例示意装饰器的用途和作用
  2. # 模拟银行项目
  3. # 业务: 存钱和取钱
  4. # ----- 小李以下小写写的装饰器-----
  5. def privileged_check(fn):
  6. def fx(n, yuan):
  7. print("正在检查权限..... OK!")
  8. fn(n, yuan) # 调用被装饰函数
  9. return fx
  10. def send_message(fn):
  11. def fy(n, x):
  12. fn(n, x)
  13. print("正在发送给...", n)
  14. return fy
  15. # ------
  16. @privileged_check
  17. def savemoney(name, x):
  18. print(name, '存钱', x, "元")
  19. @privileged_check
  20. @send_message
  21. def withdraw(name, x):
  22. print(name, "取钱", x, "元")
  23. # ----------
  24. savemoney("小王", 200)
  25. savemoney("小赵", 400)
  26. withdraw("小钱", 500)

函数的文档字符串

函数内第一次末赋值给任何变量的字符串是此函数的文档字

符串

语法:

  1. def 函数名(参数列表):
  2. '函数的文档字符串'
  3. 语句块

示例:

  1. def hello(name):
  2. '''这是一个向别人问好的函数
  3. name 绑定人的姓名
  4. '''
  5. pass

说明:

文档字符串通常用来说明本函数的功能的使用方法

函数的文档字符串绑定在函数对象的__doc__ 属性上

函数的 doc 属性

__doc__属性用于绑定函数的文档字符串

函数定义语句的完整的语法:

[@装饰器名1]

[@装饰器名2]

...

def 函数名([位置形参], [*元组形参], [命名关键字形参]

,[**字典形参]):

'文档字符串'

语句块

Python开发【第十四篇】装饰器的更多相关文章

  1. Python之路(第十一篇)装饰器

    一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1 ...

  2. 跟着老男孩教育学Python开发【第四篇】:模块

    双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*-   USER_INFO = {}   def ch ...

  3. Python开发【第四篇】:模块

    双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*-     USER_INFO = {}     de ...

  4. Python开发【第四篇】: 三大器和内置函数

    内容概要 函数名 闭包 迭代器 生成器 推导式与表达式 内置函数 装饰器 初识递归 1.函数名 函数名的运用: 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 01. 函数名的 ...

  5. Python开发【第四篇】语句与函数

    语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...

  6. Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  7. 【转】Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  8. Python开发【第四篇】:Python基础之函数

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式   result = 值1 if 条件 else 值2   # 如果条件成立,那么将 “值1” 赋值给 ...

  9. Python开发【第四篇】函数

    函数的作用 函数可以让编程逻辑结构化以及模块化 无论是C.C++,Java还是Python,函数是必不可少的知识点,也是很重要的知识点,函数是完成一个功能的代码块,使用函数可以使逻辑结构变得更加清晰以 ...

  10. Python 学习 第十四篇:命名元组

    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...

随机推荐

  1. Windows上安装运行Spark

    1.下载Scala: https://www.scala-lang.org/download/ ①注意:必须下载官方要求的JDK版本,并设置JAVA_HOME,否则后面将出现很多麻烦! ②Scala当 ...

  2. Linux Firewalld 基础实例

    本次是一个Firewalld的基础操作实例,利用Firewalld图形操作界面进行访问控制操作. 实验拓扑 需求分析 首先拓扑涉及到两个区域,这里使用work和public区域,分别做相应的规则. 1 ...

  3. linux环境安装配置nginx

    安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl- ...

  4. centos7下安装docker 以及简单使用

    一 环境准备1.虚拟机or物理机 2.centos7系统(稳定,对docker支持友好) 二 安装过程step1:使用yum命令进行安装 yum install -y docker备注:-y 表示不询 ...

  5. 201871010105-曹玉中《面向对象程序设计(Java)》第二周学习总结

    201871010105-曹玉中<面向对象程序设计(Java)>第二周学习总结             项目                                         ...

  6. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  7. Git的小疑惑

    ①怎么理解Git clone ssh://...git     和 Git remote add [shortname] [url]:Git fetch [shorename];的区别:为什么已经把远 ...

  8. jQuery对象和DOM对象转换,解决jQuery对象不能使用js方法的问题

    有时候想要jQuery对象使用js方法,但是jQuery对象是什么js方法都不能用,怎么办呢?方法其实很简单,只要转换jQuery和DOM对象就可以了. 方法一: var $cr = $(" ...

  9. c#-泛型、协变、逆变

    泛型简单介绍: 可以使用泛型声明的元素:类.接口.方法.委托 泛型之前:泛型之前使用object封装不同类型的参数,缺点:性能差.运行时判断类型(不安全)...泛型是在编译期间转为实际类型副本,所以性 ...

  10. Linux修复小技巧

    在重启时不能进入系统,出现以下提示符时.此时输入root密码进入紧急模式,将/etc/fstab文件中除 “/”(根)以外的挂载点全部注释,进系统后在修复排错