zoukankan      html  css  js  c++  java
  • Python装饰器

    什么是装饰器?

    • 在不改变原来代码的基础上,修改代码的逻辑
    • 本质就是一个高阶函数
    • 语法糖是@
    • 分类
      • 函数装饰器:定义一个函数当做装饰器
      • 类装饰器:定义一个类当做装饰器
    • 装饰器可以修饰普通方法,类方法,类...
    • 装饰器可以叠加使用

    函数装饰器

    • 装饰器本身不带参数
    def decorator(func):
        def _decorator(*args, **kwargs):
            print('decorator called, start!')
            ret = func(*args, **kwargs)
            print('decorator called, end!')
            return ret
        return _decorator
    
    @decorator
    def test(data):
        print('test : %s' % data)
    
    test('ok')
    • 装饰器本身带参数
    def decorator(*args, **kwargs):
        print(args[0])
        print(kwargs['one'])
        def _decorator(func):
            def __decorator(*args, **kwargs):
                print('decorator called, start!')
                ret = func(*args, **kwargs)
                print('decorator called, end!')
                return ret
            return __decorator
        return _decorator
    
    @decorator('x', one = 'a')
    def test(data):
        print('test : %s' % data)
    
    test('ok')

    类装饰器

    • 类装饰器本身不带参数
    class decorator:
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print('decorator called, start!')
            ret = self.func(*args, **kwargs)
            print('decorator called, end!')
            return ret
    
    @decorator
    def test(data):
        print('test : %s' % data)
    
    test('ok')
    • 类装饰器本身带参数
    class decorator:
        def __init__(self, x):
            self.x = x
    
        def __call__(self, func):
            print(self.x)
            def _dectorator(*args, **kwargs):
                print('decorator called, start!')
                ret = func(*args, **kwargs)
                print('decorator called, end!')
                return ret
            return _dectorator
    
    @decorator('a')
    def test(data):
        print('test : %s' % data)
    
    test('ok')
  • 相关阅读:
    面试题
    面试题-基础篇(1)
    Windows定时器学习
    C++中类的多态与虚函数的使用
    Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
    线程同步(互斥锁与信号量的作用与区别)
    控制台程序实现暂停功能
    Linux下gcc编译生成动态链接库*.so文件并调用它
    Linux下安装ActiveMQ CPP
    activemq Linux下的编译
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11563190.html
Copyright © 2011-2022 走看看