Python学习之装饰器进阶
函数知识回顾:
函数的参数分为:实参和形参。
实参:调用函数的时候传入的参数;
形参:分为3种(位置参数、默认参数、动态传参)
位置参数:必须传值
def aaa(a,b):
print(a,b)
aaa(1,2)
默认参数:不是必须传参数
def bbb(x=10):
print(x)
# bbb() #x = 10
# bbb(20) #x = 20
动态传参
def ccc(*args):#1,2,3,4,5
print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1,2,3,4,5)
ccc(t) ((1, 2, 3, 4, 5),)
ccc(*t) (1, 2, 3, 4, 5)
def ddd(**kwargs):
print(kwargs) # ddd(k = 'a',j = 'b')#按关键字传参数
def eee(*args,**kwargs):
print(args,kwargs) # eee(12,123) #先按位置传参,再按关键字传参
def ccc(*args):
print('ccc:',args) #(1,2,3,4,5)聚合
def inner(a,b,c,d,e):
print('inner',a,b,c,d,e)
inner(*args) #*(1,2,3,4,5) 打散
装饰器(完整解释版)
def wrapper(func):
def inner(*args,**kwargs):#定义函数的时候——*参数的聚合
ret = func(*args,**kwargs) #调用函数的时候——*参数的打散
#func是被装饰的函数,ret是被装饰函数的返回值
return ret #把被装饰的函数的返回值返回给调用者
return inner
@wrapper #hahaha = wrapper(hahaha)
def hahaha(a,b):
return a+1,b+1 ret = hahaha(1,2)
print(ret)
装饰器的高级应用:一个装饰器被几个函数调用和一个装饰器被调用的次数、一个函数被多个装饰器装饰、带参数的装饰器。
一个装饰器被几个函数调用:
l=[]#存放调用的函数
def wrapper(func):
l.append(func)#统计有几个函数调用
def inner(*args,**kwargs):
ret=func(*args,**kwargs)
return ret
return inner
@wrapper
def f1():
print('in f1')
@wrapper
def f2():
print('in f2')
print(l)
一个装饰器被调用的次数:
l=[]#存放调用的函数
def wrapper(func):
# l.append(func)#统计有几个函数调用
def inner(*args,**kwargs):
l.append(func)#统计被调用了几次
ret=func(*args,**kwargs)
return ret
return inner
@wrapper
def f1():
print('in f1')
@wrapper
def f2():
print('in f2')
f1()
f1()
f2()
f2()
print(l)
一个函数被几个装饰器装饰:
def qqxing(func):
def inner(*args,**kwargs):
print('before,inqqxing')
ret= func(*args,**kwargs)
print('inqqxing,after')
return ret
return inner
def pipia(func):
def inner(*args,**kwargs):
print('beore,pipia')
ret=func(*args,**kwargs)
print('after ,pipia' )
return ret
return inner
@qqxing
@pipia
def dapangxie():
print('饿了么')
dapangxie()
放大招带参数的装饰器:
F=True#装饰器的参数
def outer(flag):#定义
def wrapper (func):
def inner(*args,**kwargs):
if flag:
print('before')
ret=func(*args,**kwargs)
print('after')
else:
ret = func(*args, **kwargs)
return ret
return inner
return wrapper
@outer(F)
def hahaha():
print('hahaha')
@outer(F)
def shuang():
print('shuag') shuang()
hahaha()
装饰器的运行顺序

Python学习之装饰器进阶的更多相关文章
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
- Python学习 :装饰器
装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...
- python学习之-- 装饰器
高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 ...
- 从入门到自闭之python三大器--装饰器进阶
装饰器的进阶 有参装饰器: # def warpper(func): # def inner(*args,**kwargs): # user = input("user:") # ...
- Python学习笔记--装饰器的实验
装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...
- 6月4日 python学习总结 装饰器复习
1. 装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2. 装饰器的基本 ...
随机推荐
- 5. CopyOnWriteArrayList 的适用场景
package com.gf.demo04; import java.util.ArrayList; import java.util.Collections; import java.util.It ...
- 通过DFS求解有向图(邻接表存储)中所有简单回路
前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...
- LINUX sed grep awk之间比较整理
正则表达式基础 在最简单的情况下,一个正则表达式看上去就是一个普通的查找串.例如,正则表达式"testing"中没有包含任何元字符,,它可以匹配"testing" ...
- JUnit4注解
今天学习了下,mybatis中开发dao的方法,用到了JUnit4进行单元测试, 将JUnit4中的注解总结了下,供大家参考学习: JUnit 4 开始使用 Java 5 中的注解(annotatio ...
- laravel5.5通过Migrations修改表 的artisan命令
1,不同表的修改都需要通过命令创建一个文件 2,首先通过artisan创建对应表的一个文件 php artisan make:module:migration abtinvitcard(模块名) al ...
- IDEA项目搭建十四——Web站点Controller基类及布局页静态资源设计
一.简介 站点搭建完成后,编写页面时一般会有如下几个需求 1.嵌套静态页面时有很大一部分通用代码,如css.js这部分可以使用thymeleaf的局部片段代码块组成 2.这些静态资源默认放在程序中,但 ...
- 2015年6月6日,杨学明老师《IT技术人才管理角色转型与实践》专题培训在苏宁云商成功举办!
2015.6.6,在中国南京苏宁总部,研发资深顾问.资深讲师为苏宁易购IT事业部全体产品总监.研发总监进行了为期一天的<IT技术人才管理角色转型与实践>的内训服务. 杨学明老师分别从技术人 ...
- struts2从认识到细化了解
目录 Struts2的介绍与执行流程 介绍: 执行流程: 运行环境搭建 基础示例 Action类的编写 介绍: 访问servlet API 补充: 配置文件 常见配置文件: 常量的配置: struts ...
- Orchard详解--第六篇 CacheManager 2
接上一篇,关于ICacheContextAccessor先看一下默认实现,用于保存一个获取上下文,且这个上下文是线程静态的: public class DefaultCacheContextAcces ...
- spring MVC,controller中获得resuqest和response的方式
package com.devjav.spring; import java.util.List; import java.util.Locale; import javax.servlet.http ...