+# 函数 —— 2天
# 函数的定义和调用
# def 函数名(形参):
#函数体
#return 返回值
#调用 函数名(实参)
# 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
# 站在实参的角度上 : 按照位置传,按照关键字传
# 返回值:没有返回值 返回一个值 返回多个值
# 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
# 闭包函数 —— 在内部函数引用外部函数的变量
# 装饰器函数—— 装饰器一定是闭包函数
# 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
# 完美的符合了一个开发原则 :开放封闭原则
# 对扩展是开发的
# 对修改是封闭的
# 基础的装饰器
# from functools import wraps
# def wrapper(func):
# @wraps(func)
# def inner(*args,**kwargs):
# '''在函数被调用之前添加的代码'''
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# return inner
# 使用 —— @wrapper
# @wrapper
# def func(): #inner
# pass
#
# func.__name__ 不使用functools.wraps的装饰器:
def tracer(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
return result
return wrapper @tracer
def fibonacci(n):
if n in (0,1):
return n
return (fibonacci(n-1)+fibonacci(n-2)) fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)

结果:

可以看到,装饰器完全可以正常工作。。。

但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

也就是说,原函数的属性失效了

如果想要保留原函数的属性,就可以用到functools.wraps了

from functools import wraps
def tracer(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
return result
return wrapper @tracer
def fibonacci(n):
if n in (0,1):
return n
return (fibonacci(n-1)+fibonacci(n-2)) fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)

结果:


    # 带参数的装饰器
# @wrapper -- > @warapper(argument)
# 三层嵌套函数
# def outer(形参):
# def wrapper(func):
# def inner(*args,**kwargs):
# '''在函数被调用之前添加的代码'''
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# return inner
# return wrapper
# @outer(True)
# def func():
# pass
# 多个装饰器装饰一个函数
# 俄罗斯套娃 #def wrapper1(func):
# @wraps(func)
# def inner(*args,**kwargs):
# print('before 1')
# print('******')
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# def wrapper2(func):
# @wraps(func)
# def inner(*args,**kwargs):
# print('before 2')
# ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
# '''在函数被调用之后添加的代码'''
# return ret
# @wrapper1
# @wrapper2
# def func():
# print('111')
# 迭代器和生成器 —— 两天
# 内置函数 —— 两天

最新文章

  1. mysql数据去除重复及相关优化(转)
  2. 自定义CollectionViewLayout
  3. linux dns 连外网
  4. .net平台下深拷贝和浅拷贝
  5. c语言变量名称与变量
  6. nodejs学习:师哥自家的twenty博客框架
  7. Sql2008的行列转换之行转列
  8. [Java Performance] 数据库性能最佳实践 - JPA和读写优化
  9. Nopcommerce架构浅谈之文件结构
  10. Unity3D NGUI制作进度条
  11. XML约束
  12. debian install & configure(2)-drivers-nvidia
  13. ShineTime 是一个效果非常精致的缩略图相册
  14. flashcache中应用device mapper机制
  15. Angular+ionic2 web端 启动程序出现短暂 白屏或黑屏 的处理小妙招
  16. 简单的SQL注入
  17. junit,面向切面开发(动态代理),工厂设计模式,数据库连接池
  18. EXCEL文件导入时报_未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序
  19. ModelViewSet 路由 / django logging配置 / django-debug-toolbar使用
  20. 安装python后,启动时提示“0x00000000001”内存错误

热门文章

  1. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义
  2. 看到一个想收藏的的AJAX小列子
  3. Python:import 与__import__()
  4. MATLAB一元线性回归分析
  5. spark on yarn 集群部署
  6. js data日期初始化的5种方法 [转]
  7. python requests提示警告InsecureRequestWarning
  8. java8 流操作
  9. BZOJ2521:[SHOI2010]最小生成树(最小割)
  10. 【移动端】meta使用