原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类 一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式 二:装饰器的用途
(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. Nginx下配置虚拟主机的三种方法

    Nginx下,一个server标签就是一个虚拟主机. 1.基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2.基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的 ...

  2. Appnium-API-Dvice

    Device Activity Start Activity Start an Android activity by providing package name and activity name ...

  3. 014_IP专项研究监控

    一.数据demo cat /proc/net/snmp Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagr ...

  4. 记录下在阿里云linux上安装与配置Mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客:https://blog.csdn.net/kunzai6/article/details/81938613 师兄的哈哈哈 ...

  5. Spring MVC基本概念

    MVC工作原理: 模型-视图-控制器(MVC)是一个以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中解耦.通常,模型负责封装应用程序数据在视图层 ...

  6. 在webAPI的BaseController上使用RoutePrefix

    在webAPI2.2中有支持,参考地址:https://docs.microsoft.com/en-us/aspnet/web-api/overview/releases/whats-new-in-a ...

  7. 方法总结:如何实现html页面自动刷新

    使用场景: 1. 页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新) 2. 一定时间之后跳转到指定页面(登录注册之类) 3. 前端开发使用伪数据 ...

  8. (译)(function (window, document, undefined) {})(window, document); 真正的意思

    由于非常感兴趣, 我查询了很多关于IIFE (immediately-invoked function expression)的东西, 如下: (function (window, document, ...

  9. 学习使人快乐7--Mail收发原理+计划

    本篇了解邮件收发的原理与机制(smtp,pop3协议).不打算作重点学习辣~~~~~~~~~~~~~~~~ 日常感谢大佬gacl 另:打算把每周计划学的东西发在blog上面,勉励一下本咸鱼本周计划:1 ...

  10. gitlab使用过程中的需求与解决

    序言 在git使用过程中发现指令实在太多,就算记忆后不长用的话很快也会忘记掉,所以编写本文的初衷是为了记录在使用git指令的过程中所遇到的需求与解决方法,毕竟使用git的需求也就那么一些,范围不大,所 ...