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 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- Jenkins入门之导航操作
通过前面章节讲解我们已经创建了构建任务,我们已经进入了三层目录,如何回到上一级界面?如何直接回到主界面?如何知道我当前所在的位置? 我们看一下红框框选的部分,为Jenkins导航树,从这个导航树,很多 ...
- SHELL脚本--多命令逻辑执行顺序
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html Linux中可以使用分号“;”.双and号“&& ...
- 第一册:lesson ninety-nine。
原文: Ow ! Ow! What's the matter,Andy? l slipped and fell downstairs. Have you hurt yourself? Yes,I ha ...
- HTML学习感悟
HTML是一个超文本语言,原本并不打算做网站的我发现学习信息根本离不开web前端的掌握,因此需要对HTML进行一定程度的学习.对了,它可以说是网页的一个标志,打开任何网页我们看到的都是HTML的文本, ...
- Linux配置2个或多个Tomcat同时运行
一.问题说明今天操作Linux部署项目的时候,公司领导要求,只给一个服务器,但是有2个项目要部署,而且需要独立分开运行. 二.解决方法Linux配置两个或多个Tomcat,一个Tomcat对应部署一个 ...
- SqlServer中循环和条件语句
if语句使用示例 declare @a int set @a=12 if @a>100 begin ...
- Git合并指定文件到另一个分支
经常被问到如何从一个分支合并特定的文件到另一个分支.其实,只合并你需要的那些commits,不需要的commits就不合并进去了. 合并某个分支上的单个commit 首先,用git log或sourc ...
- php中的for 和foreach性能对比
总体来说,如果数据库过几十万了,才能看出来快一点还是慢一点,如果低于10万的循环,就不用测试了,两者性差异不明显.但是我还是推荐用foreach.循环数字数组时,for需要事先count($arr)计 ...
- eclipse编写js代码没有提示
安装插件 点击Help,选择Eclipse Marketplace... 搜索js,安装AngularJS Eclipse 重启eclipse,右键项目,选择Configure(配置),选择Conve ...
- 带你使用JS-SDK自定义微信分享效果
前言 想必各位在写wap端时都遇到过这样的场景吧 ----自定义分享标题.图片.描述 接下来小编给大家讲解下分享相关操作 预期效果 原始的分享效果: 使用微信JS-SDK的分享效果: 可以看出缩略图, ...