装饰器

什么是装饰器?

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

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

函数装饰器

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

语法:

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. MSSQL记录表字段数据变化的相关SQl

    在软件实施过程中,也许会有这样的问题: 表中数据出现非预期的结果,此时不确定是程序问题,哪个程序,存储过程,触发器.. 或还是人为修改的结果,此时可以用触发器对特定的表字段做跟踪监视,记录每次新增,修 ...

  2. NBU恢复数据库数据文件报错RMAN-06091

    RMAN-06091: no channel allocated for maintenance (of an appropriate type) 一.错误信息 报错信息如下 Starting res ...

  3. 逆向破解之160个CrackMe —— 023-024

    CrackMe —— 023 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  4. python测试开发django-71.自定义标签tag

    前言 django的模板里面有很多标签可以快速实现一些功能,比如{% url url_name%} 可以快捷的导入一个本地url地址. 上一篇我们可以自定义一些过滤器https://www.cnblo ...

  5. 在windows下安装Superset

    前言 最近想用一下Superset,这个是一个开源项目,可以直接通过写sql来生成图表,有时候对一些图表需求比较多的时候,可以用的上. Superset是由Airbnb(知名在线房屋短租公司)开源BI ...

  6. 从0到1的开发,社交App 完成

    内容概要 GitHub链接:GitHub链接 客户端使用Android Studio 服务端使用IDEA + SpringBoot + MyBaits 完成功能 添加好友,即时聊天,社交广场 只是一个 ...

  7. destoon搜索伪静态失败解决办法

    今天给一个朋友调试DT6.0内核的站点,搜索中文出现http 403 forbidden,找了半天,很纳闷,最后一个一个查看源代码总算找到,在此分享给大家! 解决的方法: 1.找到include/sa ...

  8. swiper使用总结-坑点汇总

    1.开发中遇到个坑,ScrollableTabView(选项卡)+swiper(轮播图)在安卓下,初始化的第一页不会渲染,需要在ScrollableTabView挂载完毕后再渲染swiper. 解决方 ...

  9. USACO Milk Routing

    洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing 洛谷传送门 JDOJ 2334: USACO 2012 Dec Silver 3.Milk Routing JDOJ传送门 ...

  10. this指向问题(改变它的指向)

    这个问题倒不是面向对象的,而是今天遇到js面向对象的时候一个例子的时候突然遇到了,call()方法,然后自己突然发现竟然忘记了,查了之后整理如下: xxx.call((对象名),参数a,参数b) xx ...