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 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- 【Go】优雅的读取http请求或响应的数据
[Go]优雅的读取http请求或响应的数据 原文链接:https://blog.thinkeridea.com/201901/go/you_ya_de_du_qu_http_qing_qiu_huo_ ...
- 五分钟彻底学会iptables防火墙--技术流ken
iptables简介 IPTABLES 是与最新的 3.5 版本 Linux内核集成的 IP 信息包过滤系统.如果 Linux 系统连接到因特网或 LAN.服务器或连接 LAN 和因特网的代理服务器, ...
- JAVA & .NET创建对象构造函数调用顺序
JAVA 定义Person类 package models; public class Person { public Person() { System.out.println("pe ...
- ASP.NET MVC3 在_ViewStart设置Layout使用RenderAction的注意事項
来源:https://dotblogs.com.tw/lastsecret/archive/2012/03/26/71052.aspx ASP.NET MVC3 在_ViewStart設定Layout ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- Springboot使用Filter以及踩过的坑
Springboot使用Filter以及踩过的坑 在Springboot中使用Filter有两种方式,注解方式,注册bean方式 一.注解@WebFilter 1.实现Filter接口(javax.s ...
- 4种方法实现Html转码
<script> var HtmlUtil = { /*1.用浏览器内部转换器实现html转码*/ htmlEncode: function(html) { //1.首先动态创建一个容器标 ...
- BZOJ2655: calc(dp 拉格朗日插值)
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
- Sysbench Sysbench在centos系统下的安装
Sysbench在centos系统下的安装 by:授客 QQ:1033553122 测试环境: CentOS-7-x86_64-DVD-1503-01.iso 下载地址: http:/ ...
- Android为TV端助力 最详细的动画大全,包括如何在代码和在XML中使用
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...


