装饰器实质还是一个函数,是对其他函数进行装饰的函数。装饰器函数接受被装饰函数的函数名,返回被装饰函数的函数名。对一个函数进行装饰有两个原则:一是不能修改被装饰函数的源代码;二是被装饰函数的调用方式不可以发生改变。

#用dec()函数对poem()函数进行装饰,但是调用方式由poem()变成了name(),
#调用方式发生了改变...这违反写装饰器的第二个原则。解决办法:把name=
#deco(poem)这一句的name改成poem.即:name=deco(name),见下一段代码。
def deco(func): #接收一个函数名,返回相同的函数名
print('古诗欣赏') #添加装饰语句
return func
def poem():
print('月落乌啼霜满天,江枫渔火对愁眠。')
name = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name
name() #装饰之后,再调用被装饰函数
'''
古诗欣赏
月落乌啼霜满天,江枫渔火对愁眠。
'''
#用dec()函数对poem()函数进行装饰,但是调用方式由poem()变成了name(),
#调用方式发生了改变...这违反写装饰器的第二个原则。解决办法:把name=
#deco(poem)这一句的name改成poem.即:name=deco(name),见下一段代码。
def deco(func): #接收一个函数名,返回相同的函数名
print('古诗欣赏') #添加装饰语句
return func
def poem():
print('月落乌啼霜满天,江枫渔火对愁眠。')
poem = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name
poem() #装饰之后,再调用被装饰函数
'''
古诗欣赏
月落乌啼霜满天,江枫渔火对愁眠。
'''

写带有@的装饰语句 :

def deco(func): #接收一个函数名,返回相同的函数名
print('古诗欣赏') #装饰语句
return func
@deco #在被装饰的函数的头顶写装饰语句,相当于poem = deco(poem)
def poem():
print('月落乌啼霜满天,江枫渔火对愁眠。')
#poem = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name
poem() #装饰之后,再调用被装饰函数
'''
古诗欣赏
月落乌啼霜满天,江枫渔火对愁眠。
'''

一般要把装饰器写成嵌套函数:

#对无参数的函数进行装饰
def guess_win(func): #传进去一个函数名german_team,返回一个函数名rooftop_status
def rooftop_status():
result = func() #相当于result=german_team()
print('天台已满,请排队!')
return result #处理被装饰的函数german_team(),然后返回处理后的结果
return rooftop_status #执行完这句后,把新定义的函数名rooftop_status返回给german_team:
#german_team=rooftop_status
@guess_win #这句话相当于german_team=guess_win(gernam_team)
def german_team():
print('德国必胜!')
return '赢了会所嫩模!输了下海干活!'
x = german_team() #由于return rooftop_status的作用是:german_team=rooftop_status
print(x)
'''
德国必胜!
天台已满,请排队!
赢了会所嫩模!输了下海干活!
'''
#对带参数的函数进行装饰
def guess_win(func): #传进去一个函数名german_team,返回一个函数名rooftop_status
def rooftop_status(*args, **kwargs):
result = func(*args, **kwargs)
print('天台已满,请排队!')
return result
return rooftop_status #执行完这句后,把新定义的函数名rooftop_status返回给german_team:
#german_team=rooftop_status
@guess_win #这句话相当于german_team=guess_win(gernam_team),调用guess_win()函数
def german_team(arg):
print('%s必胜!'% arg)
return '德国赢了会所嫩模!输了下海干活!'
@guess_win #这句话相当于spain_team=guess_win(spain_team),调用guess_win()函数
def spain_team(arg):
print('%s必胜!'% arg)
return '西班牙赢了会所嫩模!输了下海干活!'
x = german_team('德国')
y = spain_team('西班牙')
print(x)
print(y)
'''
德国必胜!
天台已满,请排队!
西班牙必胜!
天台已满,请排队!
德国赢了会所嫩模!输了下海干活!
西班牙赢了会所嫩模!输了下海干活!
'''
def decorator(F):
def new_F(a, b):
print("input", a, b)
return F(a, b)
return new_F
@decorator #相当于:square_sum=decorator(square_sum)
def square_sum(a, b):
return a**2 + b**2
@decorator
def square_diff(a, b):
return a**2 - b**2 print(square_sum(4, 3))#相当于:
# square_sum = decorator(square_sum)
# square_sum(3, 4)
print(square_diff(4, 3))
'''
input 4 3
25
input 4 3
7
'''

python再议装饰器的更多相关文章

  1. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  2. [TimLinux] Python 再谈装饰器

    参考链接:https://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators 1. 函数对象 能 ...

  3. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  4. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  5. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  6. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  7. Python进阶之装饰器

    函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...

  8. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

  9. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

随机推荐

  1. 李洪强经典面试题39-iOS 程序员 6 级考试(答案和解释)

    iOS 程序员 6 级考试(答案和解释)   我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super i ...

  2. JSON解析工具-org.json使用教程

    转自:http://www.open-open.com/lib/view/open1381566882614.html 一.简介  org.json是Java常用的Json解析工具,主要提供JSONO ...

  3. maven 工程聚合插件

    <!-- war包生成插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...

  4. Maven学习----Dependency scope

    首先官网API 2.09版本之后,有6中scope. Dependency scope 用来限制依赖的作用范围,同时也作用于各种编译路径类路径,下面详细说明这六种路径: compile这是默认范围,C ...

  5. Hadoop学习笔记(二)——zookeeper使用和分析

    分布式架构是中心化的设计.就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.Zookeeper就是一套分布式锁管理系统,用于高可靠的维护 ...

  6. zookeeper 客户端

    http://blog.csdn.net/lzy_lizhiyang/article/details/48518731 http://blueyan.iteye.com/blog/2298276 ht ...

  7. Linux 技巧:让进程在后台运行的可靠方法

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大 ...

  8. 纯JS实现动态时间

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 逻辑英语 第四季 Speaking and Listening

    1. 发音的变革 背字典:牛津双解/朗文英汉 a. 如何一分钟变伦敦腔 发音有两种:伦敦腔/其他 生理分析: ① 后置发音:瞬间华丽变声第一步 东方人靠嘴巴发音: 西方人用胸腔发音[有共鸣] 方法1: ...

  10. 3354 [IOI2005]河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫 ...