Python开发【第十四篇】装饰器
装饰器
什么是装饰器?
装饰器是一个函数,主要作用是用来给包装另一个函数或者类
包装的目的是不改变原函数名(或类名)的情况下改变或添加被包装对象的功能
函数装饰器
是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数
语法:
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开发【第十四篇】装饰器的更多相关文章
- Python之路(第十一篇)装饰器
一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1 ...
- 跟着老男孩教育学Python开发【第四篇】:模块
双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO = {} def ch ...
- Python开发【第四篇】:模块
双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO = {} de ...
- Python开发【第四篇】: 三大器和内置函数
内容概要 函数名 闭包 迭代器 生成器 推导式与表达式 内置函数 装饰器 初识递归 1.函数名 函数名的运用: 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 01. 函数名的 ...
- Python开发【第四篇】语句与函数
语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...
- Android UI开发第二十四篇——Action Bar
Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...
- 【转】Android UI开发第二十四篇——Action Bar
Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...
- Python开发【第四篇】:Python基础之函数
三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给 ...
- Python开发【第四篇】函数
函数的作用 函数可以让编程逻辑结构化以及模块化 无论是C.C++,Java还是Python,函数是必不可少的知识点,也是很重要的知识点,函数是完成一个功能的代码块,使用函数可以使逻辑结构变得更加清晰以 ...
- Python 学习 第十四篇:命名元组
Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...
随机推荐
- thinkphp5连接sql server
我用的环境是phpstudy,php版本是5.6,thinkphp连接sql server 方法如下: 1.修改database.php文件里的数据库信息 2.进入php扩展目录.我的是“E:\php ...
- 分布式CAP定理
根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),最 ...
- 目标检测论文解读3——Fast R-CNN
背景 deep ConvNet兴起,VGG16应用在图像分类任务上表现良好,本文用VGG16来解决检测任务.SPP NET存在CNN层不能fine tuning的缺点,且之前的方法训练都是分为多个阶段 ...
- django 修改 request 对象中的请求参数, 并重新赋值给 request 对象
直接上代码, 实现流程看代码及注释 def your_view(self, request): method = request.method if method == "GET" ...
- 复制excel表中的数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Pandas | 21 日期功能
日期功能扩展了时间序列,在财务数据分析中起主要作用.在处理日期数据的同时,我们经常会遇到以下情况 - 生成日期序列 将日期序列转换为不同的频率 创建一个日期范围 通过指定周期和频率,使用date.ra ...
- Pandas | 19 合并/连接
Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似.Pandas提供了一个单独的merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口 - pd.me ...
- django -- ORM建表
前戏 ORM(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. ORM的优势: ORM解决的主要问题是对象和关系的映射 ...
- Pandas之csv文件对列行的相关操作
1.Pandas对数据某一列删除 1.删除列 import pandas as pd df = pd.read_csv(file) #axis=1就是删除列 df.drop(['列名1','列名2'] ...
- js中a + 1 < a等于true,(a ==1 && a== 2 && a==3) 等于 true如何实现
先说a + 1 < a const a = { i: 1, valueOf: () => { if (a.i === 1) { return a.i++; } return a.i+2; ...