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

#用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. [转载]Axis2 and CXF的比较

    在Celtix 和XFire 宣布合并的同年,另一个著名开源Web 服务框架Axis 的后继者Axis2 也诞生了.Axis2 并非Axis 的2.0 版,而是完全重写了Axis 的新项目.作为功能和 ...

  2. DataUml Design 教程1-初识

        DataUml Design 是面向开发人员使用的一个永久免费的软件,提高软件的开发效率和代码的规范度.它主要包括三大功能,数据模型.代码生成和UML建模,数据模型功能类似于PowerDesi ...

  3. Android Studio 使用笔记:工具窗口浮动与布局恢复

    Android Studio 的工具窗口都可以变成浮动窗口,如果有多个显示器的话,这种模式非常方便.方法如下: 然后就像下图那样,可以拖拽了.如果你不小心关了,没有关系.再次点击工具栏,浮动窗口就回显 ...

  4. 解决Apache长时间占用内存大的问题,Apache 内存优化方法

    问:为什么服务器在连续运行多天后或访问峰值后,进程中的一个Apache.exe占用内存几百兆不减少?答:用记事本打开apache2\conf\httpd.conf,我在centos5上装了kloxo, ...

  5. MIC中示例程序计算π

    mic中编程十分简单,只需在普通程序中简单加几句就可以,使用 lspci|grep -i -co-processor 命令可以查看机器中是否插入MIC卡以及MIC卡的数目,MIC编程环境的配置这里就不 ...

  6. php 判断数组中是否有重复的值

    $input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input) ...

  7. TSharding源码阅读

    需要的背景知识:Spring 和Mybatis 实现原理和源码, javaassist字节码增强的使用, java及设计模式的使用 1 读取解析数据库配置文件 DataSourceScanner实现了 ...

  8. How can I detect multiple logins into a Django web application from different locations?

    1) Install django-tracking (thankyou for that tip Van Gale Google Maps + GeoIP is amazing!) 2) Add t ...

  9. ASP.NET动态网站制作(19)-- C#(2)

    前言:C#的第二次课,依旧讲解C#的基础知识. 内容: 1.GC:垃圾回收机制,可以回收托管模块中的垃圾. 2.值类型和引用类型:  (1)值类型:所有的数值类型都是值类型,如int,byte,sho ...

  10. Domino Angular 前端UI开发

    因为如今前端的要求越来越专业化,不少企业已经有前端的专业职位了.当然我们dominio软件企业.有些也在特意招一些前端的project师. 比方如今流程的多平台(之前我的有教程).就必需要有专业的UI ...