什么是Python装饰器

发布网友 发布时间:2022-04-21 17:58

我来回答

4个回答

懂视网 时间:2022-04-06 07:28

【相关学习推荐:python教程】

装饰器

  1. 本质是一个接受参数为函数的函数。
  2. 作用:为一个已经实现的方法添加额外的通用功能,比如日志记录、运行计时等。

举例

不带参数的装饰器,不用@
# 不带参数的装饰器def deco_test(func):
 def wrapper(*args, **kwargs):
 print("before function")
 f = func(*args, **kwargs)
 print("after function")
 return f return wrapperdef do_something(a,b,c):
 print(a)
 time.sleep(1)
 print(b)
 time.sleep(1)
 print(c)
 return aif __name__ == '__main__':
 # 不用@
 f = deco_test(do_something)("1","2","3")

输出:

before function
1
2
3
after function

个人理解:

相当于在 do_something 函数外面套了两个输出:before functionafter function

不带参数的装饰器,用 @
# 不带参数的装饰器def deco_test(func):
 def wrapper(*args, **kwargs):
 print("before function")
 f = func(*args, **kwargs)
 print("after function")
 return f return wrapper

@deco_testdef do_something(a,b,c):
 print(a)
 time.sleep(1)
 print(b)
 time.sleep(1)
 print(c)
 return aif __name__ == '__main__':
 # 使用@
 f = do_something("1","2","3")

输出:

before function
1
2
3
after function

个人理解:

相当于执行 do_something 函数的时候,因为有 @ 的原因,已经知道有一层装饰器 deco_test,所以不需要再单独写 deco_test(do_something) 了。

带参数的装饰器
# 带参数的装饰器def logging(level):
 def wrapper(func):
 def inner_wrapper(*args, **kwargs):
  print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
  f = func(*args, **kwargs)
  print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
  return f return inner_wrapper return wrapper

@logging(level="debug")def do_something(a,b,c):
 print(a)
 time.sleep(1)
 print(b)
 time.sleep(1)
 print(c)
 return aif __name__ == '__main__':
 # 使用@
 f = do_something("1","2","3")

输出:

[debug]: enter function do_something()
1
2
3
after function: [debug]: enter function do_something()

个人理解:

装饰器带了一个参数 level = "debug"

最外层的函数 logging() 接受参数并将它们作用在内部的装饰器函数上面。内层的函数 wrapper() 接受一个函数作为参数,然后在函数上面放置一个装饰器。这里的关键点是装饰器是可以使用传递给 logging() 的参数的。

类装饰器
# 类装饰器class deco_cls(object):
 def __init__(self, func):
 self._func = func def __call__(self, *args, **kwargs):
 print("class decorator before function")
 f = self._func(*args, **kwargs)
 print("class decorator after function")
 return f

@deco_clsdef do_something(a,b,c):
 print(a)
 time.sleep(1)
 print(b)
 time.sleep(1)
 print(c)
 return aif __name__ == '__main__':
 # 使用@
 f = do_something("1","2","3")

输出:

class decorator before function
1
2
3
class decorator after function

个人理解:

使用一个装饰器去包装函数,返回一个可调用的实例。 因此定义了一个类装饰器。

两层装饰器
# 不带参数的装饰器def deco_test(func):
 def wrapper(*args, **kwargs):
 print("before function")
 f = func(*args, **kwargs)
 print("after function")
 return f return wrapper# 带参数的装饰器def logging(level):
 def wrapper(func):
 def inner_wrapper(*args, **kwargs):
  print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
  f = func(*args, **kwargs)
  print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
  return f return inner_wrapper return wrapper

@logging(level="debug")@deco_testdef do_something(a,b,c):
 print(a)
 time.sleep(1)
 print(b)
 time.sleep(1)
 print(c)
 return aif __name__ == '__main__':
 # 使用@
 f = do_something("1","2","3")

输出:

[debug]: enter function wrapper()
before function
1
2
3
after function
after function: [debug]: enter function wrapper()

个人理解:

在函数 do_something() 外面先套一层 deco_test() 装饰器,再在最外面套一层 logging() 装饰器。

想了解更多编程学习,敬请关注php培训栏目!

热心网友 时间:2022-04-06 04:36

装饰器(decorator)是Python中的高级语法。装饰的意思就是动态扩展被装饰对象的功能。装饰器可以用于装饰函数、方法和类。
一 嵌套函数
# 定义一个外层函数def foo(): # 定义了一个内部函数 def bar(): print("hello world")
函数bar是一个定义在foo函数内部的函数。
Python中的函数是支持嵌套的,也就是可以在一个函数内部再定义一个函数。
然后,我们还知道函数是可以当作变量的,于是我们就可以在foo函数中把定义的这个bar函数返回。就像下面这样:
# 定义一个外层函数def foo(): # 定义了一个内层函数 def bar(): print("hello world") return
barfunc = foo()func() # func --> bar,这里执行func其实就相当于执行了在foo函数内部定义的bar函数
二 闭包形态1
# 闭包形态1def foo(): name = "Andy" # 外部函数的局部变量 # 定义了一个内部函数 def bar():
print(name) # 虽然bar函数中没有定义name变量,但是它可以访问外部函数的局部变量name return barfunc =
foo()func() # func --> bar --> 除了是一个函数,还包含一个值(它外层函数的局部变量)的引用
三 闭包形态2
# 闭包形态2def foo(name): # 给一个函数传参也相当于给函数定义了一个局部变量 # 定义了一个内部函数 def bar():
print(name) # 内部函数同样可以获取到传到外部函数的变量(参数) return barfunc = foo("Andy") #
把“Andy”当成参数传入foo函数 --> 其内部定义的bar函数也能拿到这个“Andy”func() # func --> bar -->
除了是一个函数,还包含一个值(它外层函数的参数)的引用
四 装饰器形态1
# 还是定义一个外层函数def foo(name): # 我接收的参数是一个函数名 # 定义了一个内部函数 def bar():
print("这是新功能。。。") # 新功能 name() # 函数名加()就相当于执行--> 我传进来原函数的函数名,这里就相当于执行了原函数
return bar# 定义一个被装饰的函数def f1(): print("hello world.") # 用foo函数装饰f1函数f1 =
foo(f1)# 不改变f1的调用方式f1() # --> 此时函数已经扩展了新功能
五 装饰器形态2
# 还是定义一个外层函数def foo(name): # 接收的参数是一个函数名 # 定义了一个内部函数 def bar():
print("这是新功能。。。") # 新功能 name() # 函数名加()就相当于执行--> 传进来原函数的函数名,这里就相当于执行了原函数
return bar# 定义一个被装饰的函数# 用foo函数装饰f1函数@foo # 使用f1 =
foo(f1)语法装饰的话稍显啰嗦,Python就提供了@语法,让装饰过程更简便def f1(): print("hello world.") #
不改变f1的调用方式f1() # --> 此时函数已经扩展了新功能。

热心网友 时间:2022-04-06 05:54


所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数:你可以试下:

def d(fp):
    def _d(*arg, **karg):
        print "do sth before fp.."
        r= fp(*arg, **karg)
        print "do sth after fp.."
        return r
    return _d
@d
def f():
    print "call f"
#上面使用@d来表示装饰器和下面是一个意思
#f = d(f)
f()#调用f




热心网友 时间:2022-04-06 07:29

Python装饰器是Python中的特有变动,可以使修改函数变得更加容易。如果是自学的话,可以看黑马程序员的视频库,很多入门的课程,非常适合小白。官网对话框还可以直接领取到课程大纲。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com