闭包:(返回函数的行为叫闭包??)

 #函数也是对象,所以可以被传递
def line_conf(a,b):
def line(x):
return a*x+b
return line line1=line_conf(1,1)
line2=line_conf(4,5)
print(line1,line2) #闭包:包含有环境变量取值的函数对象
#函数line与环境变量a,b构成闭包
#通过闭包,得到直线表达函数 y=x+1 y=4x+5

<function line_conf.<locals>.line at 0x00000000026FA9D8> <function line_conf.<locals>.line at 0x00000000026FAB70>

@修饰符(装饰器):

函数可以赋值给变量,变量可以调用函数:

def now():
print("2017-12-21")
f=now
print(f)
f()

<function now at 0x00000000020FCBF8>
2017-12-21

如果要增强now函数的功能,但不改变now函数的定义,可以在程序执行的时候,通过装饰器给函数增强功能。这种方法叫做:装饰器(Decorator)。

比如,新增的功能是打印

作为装饰器的打印函数,本质上是个返回函数的高阶函数:

def log(func):
def wrapper(*args,**kw):
print('call %s():' % func.__name__)
return func(*args,**kw)
return wrapper @log
def now():
print("2017-12-21") now()

call now():
2017-12-21

 def makebold(fn):
def wrapped():
return "<b>"+fn()+"</b>"
return wrapped def makeitalic(fn):
def wrapped():
return "<i>" +fn()+"</i>"
return wrapped @makebold
@makeitalic
def hello():
return "hello world" print(hello())

<b><i>hello world</i></b>

 #带参数的装饰器

 def makebold(pre=""):
def printMakeBold(fn):
def wrapped():
print(pre)
return "<b>"+fn()+"</b>"
return wrapped
return printMakeBold @makebold("测试")
def printfn():
return "helloworld" print(printfn())

测试
<b>helloworld</b>

 #装饰器用于类

 def decorator(aClass):
class newClass:
def __init__(self,age):
self.total_display=0
self.wrapped=aClass(age)
def display(self):
self.total_display+=1
print("total display",self.total_display)
return newClass @decorator
class Bird:
def __init__(self,age):
self.age=age
def display(self):
print("my age is",self.age) eagleLord=Bird(5)
for i in range(3):
eagleLord.display() # 在decorator中,我们返回了一个新类newClass。在新类中,我们记录了原来类生成的对象(self.wrapped),并附加了新的属性total_display,用于记录调用display的次数。我们也同时更改了display方法。
#
#
# 通过修改,我们的Bird类可以显示调用display的次数了。

total display 1
total display 2
total display 3

【python】闭包、@修饰符(装饰器)、的更多相关文章

  1. python 闭包函数与装饰器

    1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...

  2. python闭包函数与装饰器

    目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...

  3. python闭包函数、装饰器

    闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...

  4. python闭包函数及装饰器简介

    目录: 闭包函数简介 闭包函数的实际应用 装饰器简介 装饰器初期-完整版 装饰器语法糖 闭包函数简介 1.定义在函数内部的函数(函数的嵌套) 2.内部函数运用外部函数局部名称空间中的变量名 注:函数名 ...

  5. Python 函数修饰符(装饰器)的使用

     Python 函数修饰符(装饰器)的使用 1.  修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...

  6. 15 python 初学(闭包,函数装饰器)

    这一部分很重要,一定要透彻理解.可参考大神博客:  http://www.cnblogs.com/yuanchenqi/articles/5830025.html 闭包: 如果在一个内部函数里,对在外 ...

  7. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  8. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  9. python学习之类的装饰器进阶版

    装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func):    print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...

  10. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

随机推荐

  1. HTML 的 meta 标签

    我们先来看看维基百科上对 meta element 的定义: Meta elements are tags used in HTML and XHTML documents to provide st ...

  2. ttf文件属性详细信息

    python实现ttf文件属性详细信息 import sys from fontTools import ttLib def shortName( font ): name = "" ...

  3. JAVA GUI

    JAVA GUI中的事件处理:   委托事件模型:事件源对象和监听器对象具有绑定关系   一个监听器可以绑定多个事件源 一个事件源也可以绑定多个监听器 监听器有各自监听的事件类型   设置容器的布局管 ...

  4. 《精通C#》第十二章 Linq

    Linq是在.Net3.5之后首次引入的,这种查询语言简单易学,可用范围非常广泛在学着之前,一直用在数据库操作之上,但是在学习这节课之后才发现,凡是实现泛型的接口类型都可以使用linq,简单来说就是实 ...

  5. MVC3 新建项目

    一.安装工具 二.新建项目 step1:新建MVC3项目 打开新建项目窗口,在“已安装的模板”列表中选择“Web”,在右侧应用程序模板列表中选择“ASP.NET MVC3 Web应用程序”,修改项目名 ...

  6. DotnetBar在VS2010工具箱中不显示问题

    请参考:http://blog.csdn.net/yanbo710148546/article/details/7862819

  7. 通过AF "get" 请求html页面总是失败的问题

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSe ...

  8. ComboxEdit实现二级联动

    private void cmbXPROVINCE_SelectedIndexChanged(object sender, EventArgs e) { DataBind(cmbXPROVINCE, ...

  9. 怎么把Windows主机上的目录共享到Ubuntu上

    使用Oracle VM VirtualBox在Windows主机上创建了一台Ubuntu虚拟机,怎么把宿主机上的目录共享到Ubuntu上,可使用以下方法: eg.把Windows主机上D盘里的test ...

  10. asp.net ajax控件tab扩展,极品啊,秒杀其它插件

    说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...