Python函数式编程之装饰器
原则:对修改是封闭的,对扩展是开放的,
方法:一般不修改函数或者类,而是扩展函数或者类 一:装饰器
允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式 二:装饰器的用途
(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函数式编程之装饰器的更多相关文章
- python函数式编程之装饰器(一)
1.开放封闭原则 简单来说,就是对扩展开放,对修改封闭 在面向对象的编程方式中,经常会定义各种函数. 一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用 这意味着如果函 ...
- python函数式编程之装饰器(二)
以前用装饰器,都是定义好了装饰器后,使用@装饰器名的方法写入被装饰函数的正上方 在这里,定义的装饰器都是没有参数的 在定义装饰器的函数的时候,没有在括号里定义参数,这就叫做无参装饰器 既然有无参装饰器 ...
- Python模块化编程与装饰器
Python的模块化编程 我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # r ...
- python高级编程之装饰器04
from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python编程举例-装饰器
装饰器的通常用途是扩展已定义好的函数的功能 一个浅显的装饰器编程例子 #装饰器函数 def outer(fun): def wrapper(): #添加新的功能 print('验证') fun() r ...
- Python函数式编程(进阶2)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗
前言 最近成功把「前端带师」带入C#的坑(实际是前端带师开始从cocos转unity游戏开发了) 某天,「前端带师」看到这段代码后问了个问题:[这个是装饰器]? [HttpGet] public Re ...
随机推荐
- Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- certificate & encryption
openssl commonly used commands before use Configure to generate Makefile, should notice follow optio ...
- MathType7.X链接:https://pan.baidu.com/s/1rQ5Cwk5_CC9UgvgaYPVCCg 提取码:6ojq 复制这段内容后打开百度网盘手机App,操作更方便哦完美解压,无限使用
最近在写论文的过程中使用到了MathType,但是由于MathType30天使用已经过期,有些特殊符号用不了,于是开始找各种破解版.好吧,花了整整两个小时才算搞定,真是一部血泪史,现在把安装破解教程贴 ...
- 将字符串转json时,保持顺序
jo_tmp = json.loads(content.decode('utf-8'), object_pairs_hook=collections.OrderedDict)jo = json.dum ...
- JpaManytoMany
package com.allqj.calculator.entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; i ...
- Redis实战 - 5事务:multi、exec和watch
介绍 redis的目标的是: 简洁,高效,由于事务本身就是一个很复杂的东西,所有我们不能把事务做的太复杂. DISCARD 取消事务,放弃执行事务块内的所有命令. EXEC 执行所有事务块内的命令. ...
- SQL Server 创建索引
索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数 ...
- 实时同步到Hbase的优化-1
最近没有管测试环境的 def putMapData(tableName: String , columnFamily:String, key:String , mapData:Map[String , ...
- C++何时需要NEW对象,new和定义对象的区别
C++何时需要NEW对象 一.CString str; 不用new的内存区域是在栈,会自动分配空间,一般在局部变量时使用,函数结束后会自动释放空间, 定义对象就是申明对象(静态) str有系统创建并释 ...
- Codeforces 939E Maximize! (三分 || 尺取)
<题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...