装饰器

什么是装饰器?

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

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

函数装饰器

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

语法:

def 装饰器函数名(参数):
语句块
return 函数对象
@张诗琪函数名
def 函数名(形参列表):
语句块

示例:

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

函数的文档字符串

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

符串

语法:

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

示例:

def hello(name):
'''这是一个向别人问好的函数
name 绑定人的姓名
'''
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. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  2. 半小时上手laya

    laya的性能挺高,跟顶级的pixi.js差一些.比egret的性能强一些 laya的代码是偏功能性的, 观赏性,可读性比很差. 第一步,github上看了下,layaair二百星不到? 想不到堂堂的 ...

  3. Caused by: java.lang.ClassNotFoundException: Cannot find class:

    Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibat ...

  4. JDOJ 1606 数字三角形

    JDOJ 1606: 数字三角形 JDOJ传送门 Description 输入n,输出n的数字三角形 见样例 Input n Output n的数字三角形 Sample Input 4 Sample ...

  5. 【myBatis】It's likely that neither a Result Type nor a Result Map was specified.

    因为mapper.xml里把resultType写成了parameterType

  6. Pandas | 11 字符串函数

    在本章中,我们将使用基本系列/索引来讨论字符串操作.在随后的章节中,将学习如何将这些字符串函数应用于数据帧(DataFrame). Pandas提供了一组字符串函数,可以方便地对字符串数据进行操作. ...

  7. 如何使用docker部署springcloud???

    如何使用docker部署springcloud??? springcloud 必须基于 springboot 项目来开发, 这里讲解springboot项目的部署, springcloud项目也是同理 ...

  8. first-child、last-child误解

    MDN解释兄弟元素中的第一个元素 然后今天写的时候这样想出现了问题 并没有加上边框 W3C解释 尝试去掉h3,发现span加上了边框 E:first-child含义 父元素中第一个元素且第一个元素是E ...

  9. JavaScriptDOM编程学习笔记(一)DOM概述

    首先介绍下DOM,一套对文档的内容进行抽象和概念化的方法.即Document Object Model,当创建了一个网页并加载到Web浏览器中时,DOM就把编写的网页转换为一个文档对象,而通过浏览器提 ...

  10. [算法模板]Kruskal重构树

    [算法模板]Kruskal重构树 kruskal重构树是一个很常用的图论算法.主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小. 图片 ...