原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类 一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式 二:装饰器的用途
(1)增强一个组件向另一个组件发送数据时的响应能力
(2)支持多种可选行为
(3)对一个单元做代码上的修改(即代码的复用)
 import time

 # ----------------------------------------------------------------#
# 装饰器一
# ----------------------------------------------------------------# def f1():
print("Local time is ")
# print(time.time()) def f2():
print("Local time is ")
# print(time.time()) f1()
f2() # 给每一个函数添加一个打印当前时间,做下面的修改,没有违反修改是封闭的原则 def print_current_time(func):
print(time.time())
func() print_current_time(f1)
print_current_time(f2) # 抛出问题 打印时间是函数本身的,并不是强加函数 # ----------------------------------------------------------------#
# 装饰器二
# ----------------------------------------------------------------# def decorator(func):
def wrapper(): # 被封装的意思
print(time.time())
func()
return wrapper def f1():
print("This is a function:") f = decorator(f1) # 将函数f1装饰
f() # 执行装饰后的结果 # ----------------------------------------------------------------#
# 装饰器三
# ----------------------------------------------------------------# def decorator(func):
def wrapper(): # 被封装的意思
print(time.time())
func()
return wrapper @decorator
def f1():
print("This is a function:") f1() # 不改变函数的调用 # ----------------------------------------------------------------#
# 装饰器四
# ----------------------------------------------------------------# def hello(fn): # fn为回调函数
def wrapper():
print('hello, %s' % fn.__name__)
fn()
print('goodbye, %s' % fn.__name__)
return wrapper @hello
def foo():
print("I am a foo") foo() # ----------------------------------------------------------------#
# 装饰器五之装饰器终极形态
# ----------------------------------------------------------------# def decorator(func):
def wrapper(*func_name, **kw): # 被封装的意思
print(time.time())
func(*func_name, **kw) # 处理抽象函数
return wrapper @decorator
def f_1(func_name):
print("This is a function:" + func_name) @decorator
def f_2(func_name1, func_name2): # 多参数函数
print("This is a function:" + func_name1 + func_name2) @decorator
def f_3(func_name1, func_name2, **kw):
print("This is a function:" + func_name1 + func_name2)
print(kw) def f_4(func_name1, func_name2, **kw):
print("This is a function:" + func_name1 + func_name2)
print(kw) f_1('qqq') # 不改变函数的调用
f_2('aa', 'dd')
f_4('aa', 'dd', a=1, b=2, c=3)
f_3('aa', 'dd', a=1, b=2, c=3)

一步一步理解装饰器,装饰器特别好用!

 

Python函数式编程之装饰器的更多相关文章

  1. python函数式编程之装饰器(一)

    1.开放封闭原则 简单来说,就是对扩展开放,对修改封闭 在面向对象的编程方式中,经常会定义各种函数. 一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用 这意味着如果函 ...

  2. python函数式编程之装饰器(二)

    以前用装饰器,都是定义好了装饰器后,使用@装饰器名的方法写入被装饰函数的正上方 在这里,定义的装饰器都是没有参数的 在定义装饰器的函数的时候,没有在括号里定义参数,这就叫做无参装饰器 既然有无参装饰器 ...

  3. Python模块化编程与装饰器

    Python的模块化编程 我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # r ...

  4. python高级编程之装饰器04

    from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ...

  5. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  6. Python编程举例-装饰器

    装饰器的通常用途是扩展已定义好的函数的功能 一个浅显的装饰器编程例子 #装饰器函数 def outer(fun): def wrapper(): #添加新的功能 print('验证') fun() r ...

  7. Python函数式编程(进阶2)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...

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

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

  9. C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗

    前言 最近成功把「前端带师」带入C#的坑(实际是前端带师开始从cocos转unity游戏开发了) 某天,「前端带师」看到这段代码后问了个问题:[这个是装饰器]? [HttpGet] public Re ...

随机推荐

  1. 自定义QGraphicsItem

    简述: QGraphicsItem 是场景中 item 的基类.图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem ).椭圆 ( QGraphicsElli ...

  2. Freemarker网页静态化

    Freemarker的jar包 创建整合spring的配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  3. js前台计算两个日期的间隔时间(时间差)

    在后台传来两个时间字段,从中解析出两个字符串类型的日期格式 需要在前台解析出两个时间的间隔 这里采用获取两个日期的时间戳进行计算 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时 ...

  4. poj1847 Tram(最短路dijkstra)

    描述: Tram network in Zagreb consists of a number of intersections and rails connecting some of them. ...

  5. Python 猜数游戏

    import random//引用随机数rand=random.randint(0,99)t=0while 1: //用t来记录使用次数 t+=1 //自行输入一个随机数 aNumber=int(in ...

  6. Hadoop第一式:配置Linux环境之免密配置及SSH原理

    一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...

  7. linux安装lamp环境(linux+apache+mysql+php)

    源码安装 本次使用 Centos7.2 MySQL5.7.22 Apache2.4.37 PHP5.6.38 安装Apache 安装httpd和所需依赖:gcc, apr, apr-util,apr- ...

  8. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  9. Hive 2.1.1 学习笔记

    1.修改conf下的配置文件cp -a hive-default.xml.template hive-site.xml2.进入bin目录启动hive./hive 报错Exception in thre ...

  10. python Request模块

    ---恢复内容开始--- Request的五种请求方式: request.get() request.post() request.head() requst.put() request.patch( ...