开放封闭原则

1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

*args,**kwargs

def f1(*args,**kwargs):   接收函数的时候,*是聚合

print(*args)    执行函数值,*是打散

函数的有用信息

print(f1.__doc__)获取函数的说明信息

print(f1.__name__)获取函数的名字

装饰器已经非常完美了,但是有时我们正常情况下查看函数信息的方法在此处都会失效:

  1. def index():
  2. '''这是一个主页信息'''
  3. print('from index')
  4.  
  5. print(index.__doc__) #查看函数注释的方法  ##这是一个主页信息
  6. print(index.__name__) #查看函数名的方法  ##index

如何解决呢? 1 from functools import wraps


  1. def deco(func):
  2. @wraps(func) #加在最内层函数正上方
  3. def wrapper(*args,**kwargs):
  4. return func(*args,**kwargs)
  5. return wrapper
  6. @deco
  7. def index():
  8. '''哈哈哈哈'''
  9. print('from index')
  10. print(index.__doc__)
  11. print(index.__name__)
  12. '''

哈哈哈哈
index

'''

装饰器进阶:

带参数的装饰器:

  1. flag = True #带参数的装饰器
  2. def outer(f):
  3. def timmer(func):
  4. def inner(*args,**kwargs):
  5. if f:
  6. print('''执行函数之前要做的''')
  7. ret = func(*args,**kwargs)
  8. if f:
  9. print('''执行函数之后要做的''')
  10. return ret
  11. return inner
  12. return timmer
  13.  
  14. @outer(flag) #等价于@timmer
  15. def func():
  16. print(111)
  17.  
  18. func()
  19.  
  20. '''
  21. 执行函数之前要做的
  22. 111
  23. 执行函数之后要做的
  24. '''

多个装饰器装饰一个函数:

  1. def wrapper1(func): #fun = f
  2. def inner():
  3. print('wrapper1 ,before func')
  4. func()
  5. print('wrapper1 ,after func')
  6. return inner
  7.  
  8. def wrapper2(func): #func = inner1
  9. def inner():
  10. print('wrapper2 ,before func')
  11. func()
  12. print('wrapper2 ,after func')
  13. return inner
  14.  
  15. @wrapper2 #f = wrapper2(f)里面的f=inner1外面的f=inner2
  16. @wrapper1 #f = wrapper1(f) 返回inner1 f = inner1
  17. def f():
  18. print('in f')
  19.  
  20. f() #inner2()
  21.  
  22. '''
  23. wrapper2 ,before func
  24. wrapper1 ,before func
  25. in f
  26. wrapper1 ,after func
  27. wrapper2 ,after func
  28. '''

Python函数--装饰器进阶的更多相关文章

  1. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  2. python函数-装饰器

    python函数-装饰器 1.装饰器的原则--开放封闭原则 开放:对于添加新功能是开放的 封闭:对于修改原功能是封闭的 2.装饰器的作用 在不更改原函数调用方式的前提下对原函数添加新功能 3.装饰器的 ...

  3. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  4. Python 函数装饰器

    首次接触到装饰器的概念,太菜啦! Python 装饰器可以大大节省代码的编写量,提升代码的重复使用率.函数装饰器其本质也是一个函数,我们可以把它理解为函数中定义了一个子函数. 例如我们有这么一个需求, ...

  5. Python @函数装饰器及用法

    1.函数装饰器的工作原理 函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn ...

  6. Python @函数装饰器及用法(超级详细)

    函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn() # 执行传入的fn参 ...

  7. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  8. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  9. Python 函数装饰器简明教程

    定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...

随机推荐

  1. WPF实现滚动显示的TextBlock

    在我们使用TextBlock进行数据显示时,经常会遇到这样一种情况就是TextBlock的文字内容太多,如果全部显示的话会占据大量的界面,这是我们就会只让其显示一部分,另外的一部分就让其随着时间的推移 ...

  2. Java多线程1:进程与线程的概念、区别和联系

    一.进程的的概念 引用线程之前进程的概念: 进程是表示资源分配的基本单位,也是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括内存空间.磁盘空间.I/O设备等.然 ...

  3. MyBatis基础:MyBatis入门(1)

    1. MyBatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis ...

  4. PHP金额工具类之将阿利伯数字转换为大写中文数字

    1.将阿拉伯数字转换为中文大写数字 <?php namespace core\components; class PriceHelper extends \yii\base\Component{ ...

  5. SVG辅助标签

    前面的话 本文将详细介绍SVG辅助标签 超链接 在SVG中,可以使用超链接<a>.超链接可以添加到任意的图形上,类比于热区<area> SVG中的超链接有如下3个常用属性 xl ...

  6. C#程序中设置全局代理(Global Proxy)

    1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1             //设置代理 2         WebProxy WP = new Web ...

  7. windows 下 mysql服务的注册和删除

    注册: mysqld --install 服务名 --defaults-file="C:\Mysql\mysql-5.7\my.ini" 删除 sc delete 服务名 停止服务 ...

  8. Python中pandas模块解析

    Pandas基于两种数据类型: series 与 dataframe . 1.Series 一个series是一个一维的数据类型,其中每一个元素都有一个标签.类似于Numpy中元素带标签的数组.其中, ...

  9. HDU1075 字典树板子题

    题意 :给出两组字符串 一一映射,给出一种组成的文字,要求映射成另外一种思路:使用字典树,把映射的另外一个字符存在字典树的单词节点处  例如 abc   123 则把123存在abc节点中的c处即可 ...

  10. P1091 合唱队形 最长上升子序列

    思路:最长上升子序列 正着做一遍 倒着做一遍 然后 取最大值 #include<bits/stdc++.h> using namespace std; const int maxn=105 ...