menu 我的书签 python 装饰器学习笔记
文章开始
文章结尾

python 装饰器学习笔记

1、在 python 中,可以在一个函数中定义另一个函数

2、函数也能返回函数

3、可以将函数作为参数传给另一个函数

4、函数可以赋值给变量而不去执行它

    def say(func):

        

        # 在 python 中,可以在一个函数中定义另一个函数(1)

        # wrap() 函数作用域只在 say() 函数内

        def wrap():

            print(1)

            func()

            print(2)

    	# 可以不需要在一个函数里执行另一个函数,我们可以将其作为输出返回

    	# 函数也能返回函数(2)

        return wrap

    def hello():

        print('hello world')

    # 可以将函数作为参数传给另一个函数(3)

    # 函数可以赋值给一个变量而不去执行它(4)

    hello = say(hello)

    # 如果把括号放在后面,函数就会执行

    # 如果在它后面不放括号,那么不会被执行,并且可以到处传递,可以赋值给别的变量

    hello()

    print(hello.__name__) # 输出的是 wrap ,这里装饰器重写了我们函数的名字,可以使用 functools.wraps 来解决

    # @say 的写法就是装饰器的简写方法,等同于: hi = say(hi)

    @say

    def hi():

        print('hi world')

    hi()

    print(hi.__name__)



    from functools import wraps

    	

    def say(func):

    	

        @wraps(func)

        def wrap(*args, **kwargs):

            	

            print('ni hao')

            return func(*args, **kwargs)

        return wrap

    @say

    def hi():

        print('hi world')

    	

        return 'ok'

    r = hi()

    print(hi.__name__) # 输出:hi

    print(r) # 输出:ok