装饰器(带参数)

如果明白装饰器的原理那么带参数的装饰器就很容易理解了

代码:

def s1(func):
    def inner(a,b):    #f1=inner(a,b) 接受2个参数,然后在把2个参数传递给func(a,b)
        print("hello")
        r =func(a,b)
        print("word")

        return r
    return inner
@s1
def f1(a,b):
    print(a+b)

f1(20,50)

现在有个问题如果装饰的函数有的参数是1个有的是2个怎么办?

@s1
def f1(a):
    print(a+b)

@s1
def f2(a,b):
    print(a+b)

@s1
def f3(a,b,c):
    print(a+b) 

解决这个很简单:

def s1(func):
    def inner(*args,**kwargs):
        print("hello")
        r =func(*args,**kwargs)    #接受万能参数
        print("word")

        return r
    return inner
@s1
def f1(a):
    print(a)

@s1
def f2(a,b):
    print(a,b)

@s1
def f3(a,b,c):a
    print a,b,c

f1("f1===a")  #传递一个参数
f2(10,20)        #传递2个参数
f3(11,22,{"aa":"bb"})   #传递三个参数
时间: 2024-08-04 14:20:02

装饰器(带参数)的相关文章

装饰器的应用-装饰器带参数和不带参数

1 #!/usr/bin/env python 2 #encoding: utf-8 3 def start_info(): 4 print ('电视剧开头曲.......') 5 print ('开始唱歌.......') 6 def end_info(): 7 print ('电视剧结束曲.......') 8 9 def filter(start_info,end_info): #接收俩函数 10 def outer(main_fun): #接收装饰的函数 11 def app(*argv

装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序

一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 1 #!/usr/bin/env python 2 def outer(func) : 3 def inner() : 4 print("hello") 5 print("hello") 6 print("hello") 7 r = func() 8 print(

python3 如何给装饰器传递参数

[引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数 [目标] 我们有两个函数"add_fun"."add" 其中"add_fun"已经过时.如果用户有调用这个函数的话就提示它"add_fun"已经过时并且引导 它去调用"add"

python_如何修改装饰器中参数?

案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改timeout的值 如何解决这个问题? 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息 在包裹函数中添加一个函数,通过这个函数来修改timeout变量 在python3中用nonlocal来声明嵌套作用域中的变量引用,在pyth

python学习系列之python装饰器基础(6)---装饰器加参数

一.常规的装饰器,比如 @auth,执行2步操作: 1.执行auth函数,并传参func进来 2.获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值) 二.而带参数的装饰器,比如 @auth(before,after),则执行3步操作: 1.执行auth(before,after)这个函数,得到返回值ret(假设返回值为ret) 2.创建装饰器,获取返回值,拼接为@ret 3.相当于@auth函数的2个步骤: 1)执行ret函数 2)将ret函数的返回值

python装饰器带括号和不带括号的语法和用法

装饰器的写法补充: 通常装饰器的写法是@func(),而有的时候为了减少出错率,可能会写成@func,没有()括号,这时我们可以这样定义,来减少括号.下面通过两个例子还看. 一般装饰器的写法: 1 def log(func=None): 2 3 def inner(*args, **kwargs): 4 print('do something before') 5 res = func(*args, **kwargs) 6 print('do something after') 7 return

调试器带参数调试(OD,EDB)

小东西,不要在意这些细节-- OD带参数比较简单: 文件-- 打开 --  在最下面有一个参数 KALI LINUX下的EDB 命令格式为  edb –run  "对应程序路径"  参数 (注意中间的空格) 比如: 这里调试 stack程序, 参数是abcdef

python3.5.2之装饰器(1)

一.本次实验环境: 在腾讯云虚拟主机centos7上配置pyenv多版本python管理器,并安装交互式web编辑器jupyter,python版本为3.5.2.  二.装饰器: 装饰器的本质是一个函数,接收一个函数作为参数,并且返回一个函数 带参数的装饰器是一个函数,返回一个装饰器 带参数的装饰器最多允许一层,timeit()()(不允许) 在python中,一个函数可以作为参数传递给另外一个函数,还可返回一个函数(不了解此请看高阶函数)因此,我们可以把一个函数传递给另一个函数后,在这个被传递

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这