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 ...
随机推荐
- 【转】监听器(Listener)学习
一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监听的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通 ...
- 【easy】235. Lowest Common Ancestor of a Binary Search Tree
题意大概是,找两个节点的最低公共祖先 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod ...
- 课堂小练习 设计、定义并实现Complex类
定义一个负数类Complex使得下面的代码能够工作.(课本P145) #include<iostream> #include<cmath> using namespace st ...
- SpringMVC 手动控制事务提交 【转】
1.配置文件 applicationContext.xml: <bean id="txManager" class="org.springframework.jdb ...
- 同时安装多个的Mysql的实现方法
首写修改my.ini文件 修改这几项即可 [client] port= [mysql] default-character-set=utf8 [mysqld] port= server_id= 全文如 ...
- ***远程连接MYSQL提示1130 - Host is not allowed to connect to this MySQL server
如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...
- Dapper+SqlServerCe部署
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0 目录下面 选择下面这 7 个 SQL Server Compact DLL,并复制 ...
- 【JAVA】HashMap的原理及多线程下死循环的原因
再次翻到以前工作中遇到的一个问题,HashMap在多线程下会出现死循环的问题,以前只是知道会死循环,导致CPU100%把机器拖跨,今天来彻底看看 首先来看下,HashMap的原理:HashMap是一个 ...
- JS数字转中文
function number2Chinese(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return '数据非法'; let unit = '京亿万仟佰 ...
- web.xml中Servlet3.1版本的头信息格式
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...