美文网首页
Python 装饰器

Python 装饰器

作者: 小懒额 | 来源:发表于2018-11-01 00:07 被阅读0次

    在学习装饰器之前,先看一下 Python 的一些特性。

    1.函数名可作为参数传入

    先定义一个函数,用来打印自己的函数名,再定义一个函数来通过把之前函数的函数名作为参数传进去,来调用之前的函数,如下,

    def foo():
        print('foo')
    
    def bar(func):
        func()
    
    >>> bar(foo)
    foo
    

    从输出结果可以看到, bar 函数中调用了 foo 的函数实现,即函数名可作为参数传入实现传入函数的功能。

    2.装饰器实现
    def foo():
        print('foo')
    
    def bar(func):
     
        func()
    
    >>> bar(foo)
    foo
    
    # -*- coding:utf-8 -*-
    
    """实现使用一个函数来调用另一个函数"""
    
    
    def foo0():
        print('foo')
    
    
    def bar0(func):
        func()
    
    bar0(foo0) # foo
    
    """这样就可以再另外的函数里面做一些事"""
    
    def foo1():
        print('i am foo')
    
    
    def bar1(func):
        print('hello, '+func.__name__)
        func()
    
    
    bar1(foo1)  # hello, foo i am foo
    """实际上这里得到的是一个bar函数,而不是原先的 func 函数了"""
    """所以我们要使用装饰器"""
    
    
    def foo2():
        print('i am foo')
    
    
    def bar2(func):
        def wrapper():
            print('hello, ' + func.__name__)
            return func()
        return wrapper
    
    
    foo2 = bar2(foo2) # 这里可以使用语法糖来实现, @bar就行了
    foo2()
    
    
    """函数有参数"""
    from functools import wraps
    
    def bar3(func):
        @wraps(func)
        def wrapper(name):
            print('hello, %s' % name)
            return func(name)
        return wrapper
    
    
    @bar3
    def foo3(name):
        print('i am %s' % name)
    
    
    foo3('xiaoming')
    
    
    
    """带参数的装饰器"""
    def bar4(param):
        def decorate(func):
            def wrapper(name):
                if param == 1:
                    print('hello, %s' % name)
                return func(name)
            return wrapper
        return decorate
    
    
    @bar4(param=1)
    def foo4(name):
        print('i am %s' % name)
    
    foo4('xiaohong1')
    

    相关文章

      网友评论

          本文标题:Python 装饰器

          本文链接:https://www.haomeiwen.com/subject/ckfatqtx.html