Python装饰器

**1. 迭代器

  • 生成器
  • 实战:range函数效果**

装饰器

装饰器的通俗理解

装饰器的理解

  • 用于拓展原来函数功能的一种函数
  • 返回函数的函数
  • 在不用更改原函数代码的前提下给函数增加新的功能

test_decorator.py

def hello():
    """简单功能模拟"""
    print("hello world")


def test():
    print('test...')


def hello_wrapper():
    """新的函数,包裹原来的hello"""
    print('开始执行hello')
    hello()
    print('结束执行hello')


def test_wrapper():
    print('进入函数')
    test()
    print('结束执行')


if __name__ == '__main__':
    hello()
    hello_wrapper()

什么是装饰器

def hello():
    """简单功能模拟"""
    print("hello world")


def log(func):
    """记录函数执行的日志"""

    def wrapper():
        print('start...')
        func()
        print('end...')
    return wrapper

def log_in(func):
    """记录函数执行的日志"""

    def wrapper():
        print('开始进入...')
        func()
        print('结束...')
    return wrapper

@log
@log_in
def hello():
    """简单模拟功能"""
    print('hello world')


@log
def test():
    print('test ...')


if __name__ == '__main__':
    hello()
    print('-'*100)
    test()
E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator2.py
start...
开始进入...
hello world
结束...
end...
----------------------------------------------------------------------------------------------------
start...
test ...
end...

Process finished with exit code 0


带参数的装饰器

def log(name=None):
    """记录函数执行的日志"""

    def decorator(func):
        def wrapper(*args, **kwargs):
            print('{0}.start...'.format(name))
            print(args)
            print(kwargs)
            rest = func(*args, **kwargs)
            print('{0}.end...'.format(name))
            return rest
        return wrapper

    return decorator


@log('from add')
def add(a, b,*args,**kwargs):
    return a + b


@log('hello')
def hello():
    """简单模拟功能"""
    print('hello world')


@log('test')
def test():
    print('test ...')


if __name__ == '__main__':
    # hello()
    # print('-' * 100)
    # test()
    rest = add(5, 6, k=5, v=6)
    print(rest)

E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator3.py
from add.start...
(5, 6)
{'k': 5, 'v': 6}
from add.end...
11

Process finished with exit code 0

带参数的装饰器之wraps

def log(name=None):
    """记录函数执行的日志"""

    def decorator(func):
        def wrapper2(*args, **kwargs):
            """装饰器里面的函数"""
            print('{0}.start...'.format(name))
            print(args)
            print(kwargs)
            rest = func(*args, **kwargs)
            print('{0}.end...'.format(name))
            return rest

        return wrapper2

    return decorator


@log('hello')
def hello():
    """简单模拟功能"""
    print('hello world')


if __name__ == '__main__':
    print('doc:{0}'.format(hello.__doc__))
    print('name:{}'.format(hello.__name__))
    hello()

hello()带装饰器

E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator4.py
doc:装饰器里面的函数
name:wrapper2
hello.start...
()
{}
hello world
hello.end...

Process finished with exit code 0

注释掉hello()装饰器的结果

E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator4.py
doc:简单模拟功能
name:hello
hello world

Process finished with exit code 0
from functools import wraps


def log(name=None):
    """记录函数执行的日志"""

    def decorator(func):
        @wraps(func)
        def wrapper2(*args, **kwargs):
            """装饰器里面的函数"""
            print('{0}.start...'.format(name))
            print('---------------warpper:{0}'.format(func.__name__))
            print('---------------warpper:{0}'.format(func.__doc__))
            rest = func(*args, **kwargs)
            print('{0}.end...'.format(name))
            return rest
        # wrapper2.__doc__ = func.__doc__
        # wrapper2.__doc__ = func.__name__

        return wrapper2

    return decorator


@log('hello')
def hello():
    """简单模拟功能"""
    print('hello world')


if __name__ == '__main__':
    print('doc:{0}'.format(hello.__doc__))
    print('name:{}'.format(hello.__name__))
    hello()

类装饰器

def f(self):
    print('{0}>我要吃东西'.format(self.name))
    print('0000000000000')


def eat(cls):
    """吃东西装饰器"""
    # cls.eat = lambda self: print('{0}>我要吃东西'.format(self.name))
    cls.eat = f
    return cls


@eat
class Cat(object):
    """猫类"""

    def __init__(self, name):
        self.name = name


if __name__ == '__main__':
    cat = Cat('小黑')
    cat.eat()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值