python——函数之装饰器
1 问题
实际生活中,我们很难一次性就把一个函数代码写得完美无缺。当我们需要对以前的函数添加新功能时,我们应该怎么做?
2 问题解决思路
(1)可以直接修改原来的函数,在函数内直接修改。当我们对多个函数都新增这个功能时,这样修改显得代码冗余。
(2)采用装饰器来解决。装饰器是python里面的一种特殊函数(装饰其它函数),它可以在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码。
3 简单装饰器案例(python3.x)
3.1 原代码功能:根据你输入的内容,输出你输入的城市名称。原代码如下。
def bj():
print("北京!") def sz():
print("深圳!") def sh():
print("上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()
上面代码执行后结果为:
3.2 现在要添加新功能:在原来的输出城市名称前先输出"你好:"。 3.3 解决方案1:直接在原来的函数里面添加输出“你好”相应代码。修改后的代码如下:
def bj():
print("你好:北京!") def sz():
print("你好:深圳!") def sh():
print("你好:上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()
上面代码执行后结果为:

3.3 解决方案2:把新增功能写到一个新的函数里面,这个新的函数就是装饰器。修改后代码如下:
# 装饰器函数
def hello(func):
def innner():
print("你好:", end='')
func()
return innner @hello
def bj():
print("北京!") @hello
def sz():
print("深圳!") @hello
def sh():
print("上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()
上面代码执行后结果为:

4 复杂装饰器案例(python3.x)
4.1 代码功能:根据选择进入不同区域,如图片区域或音乐区域。原代码如下,
def ftp():
print("这里是图片区") def fyy():
print("这里是音乐区") # 功能代码
ychoice = input("请输如的你的选择:") if ychoice == "1":
ftp()
elif ychoice == "2":
fyy()
else:
print("输入错误:请输入1或2!")
上面代码执行后结果为:
4.2 需要新增的功能:根据不同情况,在输出时首先输出"---------------------------"或者"****************************"的分隔符。 4.3 使用装饰器来增加这个新功能,修改后的代码如下,
def login(char):
def checkin(func):
def inner():
print(char * 50)
func()
return inner
return checkin @login("*")
def ftp():
print("这里是图片区") @login("-")
def fyy():
print("这里是音乐区") # 逻辑功能
ychoice = input('''请输如的你的选择:''') if ychoice == "":
ftp()
elif ychoice == "":
fyy()
else:
print("输入错误:请输入'1'或者'2'!")
上面代码执行后结果为:
2018-08-12
python——函数之装饰器的更多相关文章
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- Python 函数之装饰器
1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- Python函数加工厂-装饰器
引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...
- Python函数的装饰器
函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- Linux 命令 —— iconv 转换编码
iconv 是 Linux 系统自带的用于转换文件编码的命令行工具. 命令参数 使用 iconv --help 命令查看命令帮助信息: 用法: iconv [OPTION...] [-f ENCODI ...
- 关于 Uboot 中有趣的 0xdeadbeef 填充
在 Uboot 的 Start.S 中存在以下源码: .globl _start _start: b start_code ldr pc, _undefined_instruction ldr pc, ...
- scala程序开发入门
scala程序开发入门,快速步入scala的门槛: 1.Scala的特性: A.纯粹面向对象(没有基本类型,只有对象类型).Scala的安装与JDK相同,只需要解压之后配置环境变量即可:B.Scala ...
- iOS 快速排序
一.快速排序概念及其思想 快速排序(QuickSort),又称为交换排序,是分治算法的一种,快速排序采用分治的策略. 1.分治法的基本思想: 将原问题分解为若干个规模更小但结构和原问题相似的子问题.递 ...
- 在Fragment中保存WebView状态
http://www.lucazanini.eu/2013/android/how-to-save-the-state-of-a-webview-inside-a-fragment-of-an-act ...
- C#委托。
什么是委托. 委托是一种数据类型. 委托的作用. 把变化的东西封装起来. 委托是引用变量,声明后不赋值为null 所以使用前校验非空. class Program { static void Ma ...
- redis/memcached可视化客户端工具TreeNMS
RedisDesktopManager 之前用的redis客户端工具还不错,今天发现一个国产的nosql客户端,还挺方便滴 TreeNMS是一款redis,Memcache可视化客户端工具,采用JAV ...
- Flask 系列之 FlaskForm
通过使用 FlaskForm ,可以方便快捷的实现表单处理. 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 ...
- 写一个可插入自定义标签的 Textarea 组件
- “插入自定义标签是什么鬼?” - “比如你要插入一个<wise></wise>的标签...” - “什么情况下会有这种需求?” - “得罪了产品的情况下...” 一.需求背 ...
- css3 简易时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...


