原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类 一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式 二:装饰器的用途
(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. 【转】一文掌握 Linux 性能分析之 I/O 篇

    [转]一文掌握 Linux 性能分析之 I/O 篇 这是 Linux 性能分析系列的第三篇,前两篇分别讲了 CPU 和 内存,本篇来看 IO. IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存, ...

  2. 【转】详解web.xml中元素的加载顺序

    顺序为: context-param --> listeners --> filters --> servlets(如DispatcherServlet等) 详见<https: ...

  3. 【Python】Flask中@wraps的使用

    先说总结,白话来讲,@wraps相当于是装饰器的装饰器. python内置的方法使用解释,看起很复杂的样子┓( ´∀` )┏ def wraps(wrapped, assigned = WRAPPER ...

  4. maven的配置-2019-4-13

    一.Maven的优点 1.  依赖管理 jar 包管理 2.一键构建 (编译-----测试------打包-----安装-----部署 ) 什么是项目构建? 指的是项目从编译-----测试------ ...

  5. springboot 中页面跳转问题:window.location.href

    我的一个HTML页面 点击注册 本该到注册页面,但是却一直跳到同目录的一个Error.html文件夹下 该页面: 删掉Error.html还不行:会报错,而且改变window.location.hre ...

  6. <!特别的一天>

    <!DOCTYPE html> <html> <head> <meta charset="gb2312/"> <title&g ...

  7. window10 蓝牙只能发不能收文件解决办法

    打开“通过蓝牙发送和接收文件”,在“接收文件”界面中无法接收蓝牙发送的文件 解决办法: 1. win+R后,输入msconfig,回车 2. 点击服务,勾选隐藏Microsoft服务,点击全部禁用 3 ...

  8. C#学习-查询表达式

    查询表达式必须以from子句开头,并且必须以select或group子句结尾 在第一个from子句和最后一个select或group子句之间,可以包含一个或多个where子句.orderby.join ...

  9. 玩转GET 和 POST

    HTTP 基本概念 HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 HTTP Request Methods 不只是 GET 和 ...

  10. ImCash:论拥有靠谱数字钱包的重要性!

    数字货币被盗已经不是什么新鲜事,前有交易所币安被黑客攻击,Youbit破产,后有“钓鱼邮件“盗号木马,安全对于数字货币用户来讲至关重要. 现行市场痛点:   2017年9月以太坊Parity钱包的漏洞 ...