首页 > 代码库 > python 装饰器

python 装饰器

1 装饰器参数

1.1 装饰器和被装饰函数都不带参数

"""

装饰器装饰一个函数时,究竟发生了什么

"""

def decorator_hello(func):

      print("decorator_hello called")

      return func

 

 

@decorator_hello

def hello():

      pass

 

"""

代码意义跟下面是一样的

def decorator_hello(func):

      print("decorator_hello called")

      return func

     

def hello():

      pass

 

hello = decorator_hello(hello)

"""

装饰器没传参数的时候(隐性参数就是被装饰的函数对象)

 

1.2 装饰器带参数– 被装饰函数无参数

当需要在装饰函数的同时传入参数的话,那么就需要多包装一层,先传入参数返回一个装饰的函数, 这个返回的的函数就跟以前一样接受被装饰的函数(f)作为参数并且返回一个函数作为装饰最后的方法供调用

def decorator_hello1(args, args2):

      print("decorator_hello1 called", args, args2)

      def real_func(func2):

            return func2

      return real_func

 

@decorator_hello1("111", "222")

def hello():

      print("xxxxxxx")

hello()

 

1.3 装饰器带参数– 被装饰函数带参数

需要再内嵌一层函数,这个函数接收俩个参数*args, **kwargs,用于接收函数传进来的参数

def decorator_hello1(args, args2):

      print("decorator_hello1 called", args, args2)

      def real_func(func2):

            def handle_func(*args, **kwargs):

                  return func2(*args, **kwargs)

            return handle_func

      return real_func

 

@decorator_hello1("111", "222")

def hello(name1, name2):

      print("name1 ", name1, "name2 ", name2)

 

hello("sysnap", "jim")

 

1.4 装饰器无参数– 被装饰函数带参数

def decorator_hello1(func):

      def handle_func(*args, **kwargs):

            return func(*args, **kwargs)

      return handle_func

 

@decorator_hello1

def hello(name1, name2):

      print("name1 ", name1, "name2 ", name2)

 

hello("sysnap", "jim")

 

如果已经确定函数的个数,可以直接写

def decorator_hello1(func):

      def handle_func(name1, name2):

            return func(name1, name2)

      return handle_func

 

2 装饰器执行顺序

python 装饰器