2019-05-26python装饰器到底是什么?

2019-05-26  本文已影响0人  测序九月

装饰器例子

参考语法

def mydecorator(func):
    def wrapper(*args,**kargs):
        '''wrapper function'''
        print("in wrapper")
        func(*args,**kargs)
    return wrapper

@ mydecorator
def example():
    """example function"""
    print("in example")

装饰器是什么?
个人理解,装饰器,是python中一种写法的定义。他仍然符合python的基本语法,只是一种框架,
比如上述代码,我想在example函数输出前,输出in wrapper这句话
我可以怎么做?

print("in wrapper")
example()

但是我想在多个函数比如还有example2,example3前输入同样的话

 def example_all(func):
    print("in wrapper")
    func()

编程思想之一,定义函数,减少重复写代码

example_all(example)

然后调用

map(example_all,(example,))

函数多就直接map

example = example_all(example)

以后调用example实际是调用example_all(example)

我们在定义example_all时调用了func(),我们知道func函数自身要传入参数,
直接传参?

>>>def mydecorator2(func):
    print("haha")
    func(*args,**kargs)

>>> mydecorator2(example)()
haha
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    mydecorator2(example)()
  File "<pyshell#41>", line 3, in mydecorator2
    func(*args,**kargs)
NameError: name 'args' is not defined

报错args和*kargs未定义,说明这两兄弟只能在def中用。

总结

敲黑板,重点,

1、装饰器的写法,要在函数中定义一个函数,一般写wrapper,主要是为了用args,*kargs传参不报错。
1、1 记得return wrapper,不然只定义不执行,没什么用。

上一篇下一篇

猜你喜欢

热点阅读