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 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- python重试库retryiny源码剖析
上篇博文介绍了常见需要进行请求重试的场景,本篇博文试着剖析有名的python第三方库retrying源码. 在剖析其源码之前,有必要讲一下retrying的用法,方便理解. 安装: pip insta ...
- SSM框架的sql中参数注入(#和$的区别)
<select id="findUsersByUserName2" resultType="java.util.Map" parameterType=&q ...
- js绑定下拉框
---恢复内容开始--- 方法一 js-ajax部分 function GetDListOfCt() { $.ajax({ url: "../../Ajax/Boss_Show.ashx?t ...
- c#连接oracle数据库 DBHelper
闲着没事自己写了一个OracleHelper类,希望大神给点建议优化 using System; using System.Collections.Generic; using System.Linq ...
- [Linux] PHP-FPM开启慢日志记录
fpm:FastCGI Process Manager 是一种替代的PHP FastCGI实现,对于负载较重的站点非常有用. .先进的进程控制,优雅的停止启动 .能够使用不同的uid/gid/chro ...
- java_自定义标签,我的第一个自定义标签!
自定义标签,我的第一个自定义标签! 总共分两步 编写一个实现tag接口的java类,把jsp页面中的java代码移到这个类中,(标签处理器类) 编写标签库描述符(tld)文件,在tld文件中把标签处理 ...
- fork/join 全面剖析
fork/join作为一个并发框架在jdk7的时候就加入到了我们的java并发包java.util.concurrent中,并且在java 8 的lambda并行流中充当着底层框架的角色.这样一个优秀 ...
- js的数据类型:单例模式,工厂模式,构造函数
js数据类型 基本数据类型:string undefined null boolean number 引用数据类型 Object array function 二者的区别 基本数据类 ...
- 真实世界的脉络].(英)戴维.多伊奇.pdf
[真实世界的脉络].(英)戴维.多伊奇.pdf 宇宙.时间.生命.等等,如果用量子物理学.计算机科学.进化论.认识论将这些最基本而又复杂的问题纠缠在一起时,那将会是一幅什么样的图景呢?也许,我们穷尽一 ...
- HTML float 和 absolute
block元素和inline元素在文档流中的排列方式: block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽度自动填满其父元素宽度.block元素可以 ...


