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()
时间: 2024-12-11 01:54:44

Python学习之装饰器进阶的相关文章

六、PYTHON 学习之装饰器使用

Python是一种强大的语言,即可浅尝辄止,也可深入挖掘.很适合做科学计算.数据挖掘等等.今天我将简单介绍一下Python的装饰器(Decorators)的用法 . 假设我们想要庆祝下生日,需要邀请一些朋友过来参加.但是你有个讨厌的朋友,叫Joe,必须不能让他来啊.可能首先你想到的是建一个list,然后迭代查找并移除所有的Joe童鞋.这当然是个好方法,但是这里为了介绍装饰器,我们会用@来完成这个工作.虽然可能看起来没有什么必要,但是有助于大家学习装饰器的用法. 首先创建一个Python文件app

python学习笔记--装饰器

1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调: def showInfo(fun): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrap def f(x,y): print

十、PYTHON 学习之装饰器加深理解

在第六章已经有所介绍,这里看到一篇比较好的文章转过来. 基本概念 装饰器是23z种设计模式之一,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子来理解,咖啡,加糖的咖啡,加牛奶的咖啡. 本质上,还是咖啡,只是在原有的东西上,做了"装饰",使之附加一些功能或特性. 例如记录日志,需要对某些函数进行记录 笨的办法,每个函数加入代码,如果代码变了,就悲催了 装饰器的办法,定义一个专门日志记录的装饰器,对需要的函数进行装饰.

Python 学习笔记 - 装饰器

这一节了解了一些装饰器的简单使用. 首先来看一个预备知识,把一个函数当做参数,传入另外一个函数 比如说我传递outer(f1),我传入的是f1的内存地址,a=func()其实执行了f1()这个函数,并把返回值赋给了a,因此当我打印print(a),他会输出hee >>> def outer(func):     print(func)     a=func()     print(a) def f1():     print("aaa")     return &qu

Python学习之装饰器

装饰器出现的原因是因为我们应对新的需求:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能:它的本质是闭包函数. 装饰器的结构: def timmer(func): def inner(*args,**kwargs): '''添加函数调用之前的扩展代码''' ret = func(*args,**kwargs) '''添加函数调用之后的扩展代码''' return ret return inner 两个def 两个return互相对应. 装饰器的设计模式:是开放封闭原则:既对扩展是开放的

python学习之-装饰器

1. 什么是装饰器 装饰器就是用来为被装饰的对象新增功能的工具/函数,被装饰的对象可以是任意可调用的对象,装饰器本身也可以是任意可调用的对象 2. 为何要用装饰器 开放封闭原则:对修改封闭,对扩展开放 装饰器需要遵循的原则: 1. 不能修改被装饰对象的源代码 2. 不能修改被装饰对象的调用方式 PS:装饰器的目标:就是要在遵循原则1和2的前提下,为被装饰对象新增功能 3. 如何实现装饰器 import time def index():  #这是被装饰对象 time.sleep(1) print

python学习-42 装饰器 --- 函数闭包1

函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson(): print('孙子说:我的爷爷是%s' % name) grandfson() son() father('小明') 运行结果: hello world 儿子说:我的爸爸是小明 孙子说:我的爷爷是小明 Process finished with exit code 0 函数的包: 就是嵌套里的

python学习之装饰器的wraps作用

未加@wraps # def tag(name):# def decorator(func):# def wrapper(text):# value=func(text)# return "<{name}>{value}</{name}>".format(name=name,value=value)# return wrapper# return decorator## @tag("p")# def my_upper(text):# valu

python学习:装饰器用法

1 #!/usr/bin/env python 2 #coding:utf-8 3 4 name="alex" 5 psw="abc123" 6 7 def auth(func): 8 def wrapper(*args,**kwargs): 9 username=input('input your username:') 10 password=input('input your password:') 11 12 if username==name and pa